文章目录
最近在完成商城案例作业时,遇到提交注册密码时是一串数字和字母,觉得不安全,遂研究起来加密。
加密算法很多,索性学习了几个常用的(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'
'''