散列密码与 Python 中的原始密码不匹配
Hashed password doesn't match original in Python
我有两个休息端点,一个注册用户,第二个让该用户登录。这是我用来散列用户密码并将散列密码存储在数据库中的代码,
from passlib.hash import pbkdf2_sha256
def _get_hashed_password(self, password):
return pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)
现在在登录端点上,我使用此代码来验证散列密码,
password = data['password']
hash = pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)
pbkdf2_sha256.verify(user.hashed_password, hash)
此方法失败,显然是因为两个密码不同,
$pbkdf2-sha2560000$ai0FoDTG2BuDkDKGEIJQKg$Ik06dr61.2rRMDwZCZMdVq.zMe5887.ksDxvmSXFRwE
$pbkdf2-sha2560000$pHTuHYNwLoXQeu8dI0QoxQz4cZl9Njz9X/bxNtWCZzzeplWO.jTZA2v5lvcmgFE8
我想知道如何让它工作?
pbkdf2_sha256.encrypt
和 pbkdf2_sha256.verify
所做的不仅仅是计算密码的哈希值。仔细查看 pbkdf2_sha256.encrypt
的输出
$pbkdf2-sha2560000$ai0FoDTG2BuDkDKGEIJQKg$Ik06dr61.2rRMDwZCZMdVq.zMe5887.ksDxvmSXFRwE
----------------------------------------------------------------------------------------
$ algorithm $rounds$ salt $ the actual hash
您可以切换算法,在几年内增加轮数,并且pbkdf2_sha256.verify
仍然能够根据存储在您数据库中的哈希来验证明文密码。
两次散列相同的密码不会每次都得到相同的结果,因为使用了随机盐。如果攻击者获得对您的密码哈希的访问权限,盐会阻止 rainbow table attacks。基本上,您计算的不是 hash(password)
,而是 hash(salt + password)
。由于上面的字符串中已经给出了 salt 并且您大概知道密码,因此您也将知道 salt + password
的值并且您的生活不会更加困难。但是对于花费大量时间进行预计算的攻击者来说,这些哈希中的 hash(password)
、none 将很有用,因为它们不包含您的随机盐。
如评论中的示例所示,您无需执行任何特殊操作即可验证您的密码:
pbkdf2_sha256.verify(password, user.hashed_password)
验证密码时无需调用pbkdf2_sha256.encrypt
。 pbkdf2_sha256.verify
为您完成所有这些。
我有两个休息端点,一个注册用户,第二个让该用户登录。这是我用来散列用户密码并将散列密码存储在数据库中的代码,
from passlib.hash import pbkdf2_sha256
def _get_hashed_password(self, password):
return pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)
现在在登录端点上,我使用此代码来验证散列密码,
password = data['password']
hash = pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)
pbkdf2_sha256.verify(user.hashed_password, hash)
此方法失败,显然是因为两个密码不同,
$pbkdf2-sha2560000$ai0FoDTG2BuDkDKGEIJQKg$Ik06dr61.2rRMDwZCZMdVq.zMe5887.ksDxvmSXFRwE
$pbkdf2-sha2560000$pHTuHYNwLoXQeu8dI0QoxQz4cZl9Njz9X/bxNtWCZzzeplWO.jTZA2v5lvcmgFE8
我想知道如何让它工作?
pbkdf2_sha256.encrypt
和 pbkdf2_sha256.verify
所做的不仅仅是计算密码的哈希值。仔细查看 pbkdf2_sha256.encrypt
$pbkdf2-sha2560000$ai0FoDTG2BuDkDKGEIJQKg$Ik06dr61.2rRMDwZCZMdVq.zMe5887.ksDxvmSXFRwE
----------------------------------------------------------------------------------------
$ algorithm $rounds$ salt $ the actual hash
您可以切换算法,在几年内增加轮数,并且pbkdf2_sha256.verify
仍然能够根据存储在您数据库中的哈希来验证明文密码。
两次散列相同的密码不会每次都得到相同的结果,因为使用了随机盐。如果攻击者获得对您的密码哈希的访问权限,盐会阻止 rainbow table attacks。基本上,您计算的不是 hash(password)
,而是 hash(salt + password)
。由于上面的字符串中已经给出了 salt 并且您大概知道密码,因此您也将知道 salt + password
的值并且您的生活不会更加困难。但是对于花费大量时间进行预计算的攻击者来说,这些哈希中的 hash(password)
、none 将很有用,因为它们不包含您的随机盐。
如评论中的示例所示,您无需执行任何特殊操作即可验证您的密码:
pbkdf2_sha256.verify(password, user.hashed_password)
验证密码时无需调用pbkdf2_sha256.encrypt
。 pbkdf2_sha256.verify
为您完成所有这些。