Python笔记:PBKDF2算法
PBKDF2算法是不可逆加密算法的一种,广泛的用于存储用户密码的系统中。
由于之前的系统有密码重发的功能,就是将用户的临时密码再发送一次,所以之前在存储用户密码时,使用的是可逆的加密算法。
客户的技术人员知道后,紧急提了一个变更,要求将用户密码修改为不可逆的加密算法。
MD5
作为最常用的不可逆加密算法,在早期的系统中很多密码都是通过MD5加密存储的。
还记得上大学期间,多数小网站管理比较混乱,也不经常升级系统,给系统打补丁。每当DISCUZ等论坛有漏洞爆出来后,甚至可以通过baidu找到还在使用旧版本的网站。
一通倒腾之后,就把论坛的数据库down下来了。 打开之后,往往看到的就是用MD5加密后的用户密码。
由于算法是不可逆的,所有当时有很多MD5加解密的网站,用户每加密一个字符串,就会将明文与密文存储成字典,时间一长,很大一部分的密文都可以找出对应的明文。
PBKDF2算法
想要避免MD5的问题,最简单方式就是在MD5加密时,将明文加上一段随机生成的盐值(Salt),保证即使是同样的用户密码,由于盐值的存在,也会加密出不同的密文。
但是随之而来,又有了hash碰撞等新的攻击方式被密码学家发现,MD5算法几乎是不安全的了。
目前比较推荐的hash算法就是PBKDF2算法。 可以这样理解,PBKDF2就是将密码加随机盐值,通过SHA加密算法,运算数万次。
PBKDF2算法已经被集成在Python的hashlib库中,帮助文档如下:
pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key
Password based key derivation function 2 (PKCS #5 v2.0) with HMAC as pseudorandom function.
hash_name:指定算法(SHA1…SHA512)
password: 密码明文
salt: 盐值
iterations: 运算次数
dklen: 密文长度
简单验证如下:
1
2
3
4
5
6
7
8
9
>>> import hashlib
>>> import binascii
>>> dk = hashlib.pbkdf2_hmac('sha1', b'password', b'salt', 1)
>>> binascii.hexlify(dk)
b'0c60c80f961f0e71f3a9b524af6012062fe037a6'
>>> dk = hashlib.pbkdf2_hmac('sha512', b'mypassword', b'1234567890123456', 50000)
>>> binascii.hexlify(dk)
b'9f0be6c4b6c4ce7624a920316a768eef19dcf506770962f4cb0cc8161bd56dcd65105cb909c07a58bd604b5c2637ce77d4eccb6ef4c53d069509d9b7e82963b4'
参考资料:
Written with StackEdit.