密码学基础之PBKDF2算法

站点登录需要输入用户名和密码,而密码属于个人敏感数据,应当只保存密码的单向哈希值。简单的哈希值,无法防止彩虹表攻击,使用基于口令的密钥派生算法PBKDF2可以解决这种问题。

PBKDF2 需要以下输入:

  1. 哈希算法
  2. 密码
  3. 盐值
  4. 迭代次数

哈希算法:建议选择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

你可能感兴趣的:(密码学基础之PBKDF2算法)