用python实现MD5、sha256、sha384、sha512、base64加密


最近在完成商城案例作业时,遇到提交注册密码时是一串数字和字母,觉得不安全,遂研究起来加密。
加密算法,以及对应的密文
加密算法很多,索性学习了几个常用的(MD5、sha256、base64)。

一、hashlib介绍

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

在python3的hashlib标准库中可以调用SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。

二、使用hashlib库进行md5加密

1、加密未混淆代码

import hashlib

def jm_md5(password):
    m = hashlib.md5()  # 构建MD5对象
    m.update(password.encode(encoding='utf-8')) #设置编码格式 并将字符串添加到MD5对象中
    password_md5 = m.hexdigest()  # hexdigest()将加密字符串 生成十六进制数据字符串值
    return password, password_md5

g = jm_md5('123456')
print(g)

结果 :(‘123456’, ‘e10adc3949ba59abbe56e057f20f883e’)

2、混淆加密代码

我们知道 update可以将值增加,到集合(字典)或者键值对中。
在MD5加密中,它能起到字符串拼接作用,也就是能达到混淆加密的作用。

import hashlib
def hxjm_md5(password,value):
    '''
    :param password: 加密字符串
    :param value: 混淆字符串
    :return: 将混淆后的加密结果转成16进制字符串形式返回
    '''

    m = hashlib.md5(password.encode("utf-8"))
    m.update(value.encode('utf-8'))
    pwd_md5 = m.hexdigest()
    return password,value,pwd_md5

j = hxjm_md5('123456','wuhan')
print(j)

结果:(‘123456’, ‘wuhan’, ‘8ebbaf4714f033d20a0fef5f25ed63de’)

常见的加密方式:字符串添加当前时间戳生成一个唯一的MD5值并返回

import time
import hashlib

def hxjm_md5(password):

    value = str(time.time()) # 获取当前时间戳,转化为字符串并赋值给value
    print("当前时间::" + time.strftime("%H:%M:%S", time.localtime(time.time())))
    m = hashlib.md5(password.encode('utf-8'))
    m.update(value.encode('utf-8'))
    pwd_md5 = m.hexdigest()
    return password,value,pwd_md5

g = hxjm_md5('123456')
print(g)

结果:(‘123456’, ‘1581344237.6187823’, ‘4612dadda102056fcdbce06799b70940’)

1581344237.6187823 是时间戳,可以用time.localtime(time.time())函数进行转换。

三、使用hashlib库进行sha256、sha384、sha512加密

sha256和sha512在python中使用方法基本一样,只是返回的摘要算法不同,代码中只演示sha256。

def jm_sha256(key, value='wuhan'):
    '''
    :param key: 明文密码
    :param value: 混淆字符串
    :return:混淆后的加密结果
    '''
    hsobj = hashlib.sha256(key.encode("utf-8"))
    hsobj.update(value.encode("utf-8"))
    return hsobj.hexdigest()
    
print(jm_sha256('123456'))

结果:6fecd7d60a883872ab0b74656f9de08b3b7b396e0a52846069bf8610982e6990

四、多重加密(加盐加密)

一次MD5或者sha256很容易被人反编译或者通过穷举法给编译出来,这个时候就需要通过加盐加密、多重加密来保障密码安全。
加盐加密:就是在字符串中加入固定的或者随机的字符串,将拼接后的结果进行加密。
多重加密:就是对一个字符串进行多个算法混合加密,如:sha256(md5($pass))等

'''
  密码加密
 version:01
 author:jasn
 Date:2020-02-10
'''
import hashlib,random,string,time


def jm_sha256(key):
    '''
    :param key: 加密字符串
    :return:返回混淆后加密密问
    '''
    # value 10位数的随机盐
    value = ''.join(random.sample(string.ascii_letters +str(time.time()),10))
    hsobj = hashlib.sha256(key.encode("utf-8"))
    hsobj.update(value.encode("utf-8"))
    return hsobj.hexdigest()


def jm_md5(key, value='china'):
    '''
    :param key: 加密字符串
    :param value: 固定的盐,用来混淆
    :return: 返回混淆后加密密问
    '''
    hsobj = hashlib.md5(key.encode("utf-8"))
    hsobj.update(value.encode("utf-8"))
    return hsobj.hexdigest()


if __name__ == '__main__':
    g = jm_md5(jm_md5((jm_sha256('123456'))))
    print(g)

加盐多重混淆后的加密结果:200b86a5b31c12c2801d0109562048e4

五、base64加密

差一点忘记了,想对比其他几种加密方式,base64起不到加密的作用,但是为了学习还是写一写。

Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32、Base16编码。标准Base64编码使用的64个字符为:
在这里插入图片描述
Base64编码本质上是一种将二进制数据转成文本数据的方案。对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在上面的索引表中找到对应的字符,最终得到一个文本字符串。
在这里插入图片描述
可知 Hello! 的Base64编码结果为== SGVsbG8h ==,原始字符串长度为6个字符,编码后长度为8个字符,每3个原始字符经Base64编码成4个字符,编码前后长度比4/3,这个长度比很重要 - 比原始字符串长度短,则需要使用更大的编码字符集,这并不我们想要的;长度比越大,则需要传输越多的字符,传输时间越长。Base64应用广泛的原因是在字符集大小与长度比之间取得一个较好的平衡,适用于各种场景。

上代码敲一下

import base64

a = "this is a test"
bs64 = base64.b64encode(a.encode('utf-8')) # 对字符串编码
print(bs64)
'''
结果:
>>>: b'dGhpcyBpcyBhIHRlc3Q='
'''
debs64 = base64.b64decode(bs64)   # 对base64编码进行解码
print(debs64)

'''
结果:
>>>: b'this is a test'
'''
发布了46 篇原创文章 · 获赞 37 · 访问量 4528

猜你喜欢

转载自blog.csdn.net/weixin_42444693/article/details/104255330