Python笔记:PBKDF2算法

Reading time ~1 minute

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'

参考资料:

  1. 关于存储用户密码的思考,bcrypt 和 PBKDF2算法
  2. 如何安全的存储用户的密码

Written with StackEdit.

AZ-204: Practice topic 5

1. inboundOutboundBackend2. C### [Page 25](https://www.examtopics.com/exams/microsoft/az-204/view/25/)25. 26. 27. 28. 29. ### [Page 26](h...… Continue reading

AZ-204: Practice topic 4

Published on February 20, 2022

AZ-204: Practice topic 3

Published on February 07, 2022