站点登录需要输入用户名和密码,而密码属于个人敏感数据,应当只保存密码的单向哈希值。简单的哈希值,无法防止彩虹表攻击,使用基于口令的密钥派生算法PBKDF2可以解决这种问题。
PBKDF2 需要以下输入:
- 哈希算法
- 密码
- 盐值
- 迭代次数
哈希算法:建议选择SHA256或更安全的算法
密码:用户的输入值
盐值:建议最少8个字节,应使用安全的随机数
迭代次数:建议迭代10000次左右,对于性能有特殊要求的可迭代1000次
PBKDF2还有dk_len参数,通常用不到,本文省略。
下面是Python的演示代码:
# Python 3.4+
import hashlib, binascii
def retrieve_data_from_database(user):
"""从数据库获取指定用户密码的PBKDF2哈希值,这里只是演示
"""
data = {'yang': b'e75dfdc937acc5b7fccb2bc4237f75248c5bbe01797f70049be8abf43e55be44'}
return data[user]
def validate_password(user, password):
"""验证密码是否正确
password的PBKDF2哈希值和存储的PBKDF2哈希值比较,相同则验证通过
"""
salt = b'\x7d\xef\x87\xd5\xf8\xbb\xff\xfc\x80\x91\x06\x91\xfd\xfc\xed\x69'
dk = hashlib.pbkdf2_hmac('sha256', password, salt, 10000)
saved_data = retrieve_data_from_database(user)
return binascii.hexlify(dk) == saved_data
def login(user, password):
"""用户登录演示
"""
if not validate_password(user, password):
print('user or password error')
# 其它逻辑
相关文章
参考文献
[NIST] Recommendation for Password-Based Key Derivation: Part 1: Storage Applications
网友评论