加密
1.散列加密
散列函数是一种不可逆的加密算法,即无法解密;MD5默认生成32位的密文;
2. python使用MD5加密
import hashlib
# 实例化对象
obj=hashlib.md5()
# 加密
obj.update("admin".encode("utf-8"))#加密的时候必须是字节
# 获取密文
v=obj.hexdigest()
print(v)
3.撞库
-
将上面产生的密文在网站上进行解密测试,发现被解析出原文;因为MD5算法产生的值唯一;因此可能存在对应的密文字典;通过查询可以解析到结果,发生撞库现象;
4.加盐
-
为了解决上述问题,使用MD5的加盐功能
import hashlib # 实例化对象 obj=hashlib.md5(b'ssdgsdfhhdfgdf') # 加密 obj.update("admin".encode("utf-8"))#加密的时候必须是字节 # 获取密文 v=obj.hexdigest() print(v) # 21232f297a57a5a743894a0e4a801fc3 # 27caf5f79691c06900114ff867b98309
-
进行解密测试
解密失败,无法解析出对应的值
5.编写对应的加密函数
- 编写好函数方便后期的调用与使用
- 应用场景
- 一般在数据库中存储的密码存储为密文的形式,因此在数据库设计的时候可以将密码字段设置为32位;
- 在网站中用来产生token,进行加密验证;
- 补充:django中应用MD5的时候,一般django配置文件
settings.py
文件中的SECRET_KEY作为盐;因此在使用,django的时候一定要保护好django的SECRET_KEY;
import hashlib
SALT="盐"
def md5(strings):
hash_object=hashlib.md5(SALT.encode("UTF-8"))#转换成字节
hash_object.update(strings.encode('utf-8'))
return hash_object.hexdigest()
if __name__ == '__main__':
print(md5("test"))
每天都是更接近成功的一天;