Mel*_*art -1 python hash passlib
我有两个休息端点,一个用于注册用户,另一个用于登录用户.这是我用来散列用户密码并将散列密码存储在数据库中的代码,
from passlib.hash import pbkdf2_sha256
def _get_hashed_password(self, password):
return pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)
Run Code Online (Sandbox Code Playgroud)
现在在登录端点上我使用此代码来验证散列密码,
password = data['password']
hash = pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)
pbkdf2_sha256.verify(user.hashed_password, hash)
Run Code Online (Sandbox Code Playgroud)
这种方法失败并且显然是因为两个密码不同,
$pbkdf2-sha256$200000$ai0FoDTG2BuDkDKGEIJQKg$Ik06dr61.2rRMDwZCZMdVq.zMe5887.ksDxvmSXFRwE
$pbkdf2-sha256$200000$pHTuHYNwLoXQeu8dI0QoxQ$2z4cZl9Njz9X/bxNtWCZzzeplWO.jTZA2v5lvcmgFE8
Run Code Online (Sandbox Code Playgroud)
我想知道如何让它工作?
pbkdf2_sha256.encrypt并且pbkdf2_sha256.verify不仅仅是计算密码的哈希值.仔细看看输出pbkdf2_sha256.encrypt
$pbkdf2-sha256$200000$ai0FoDTG2BuDkDKGEIJQKg$Ik06dr61.2rRMDwZCZMdVq.zMe5887.ksDxvmSXFRwE
----------------------------------------------------------------------------------------
$ algorithm $rounds$ salt $ the actual hash
Run Code Online (Sandbox Code Playgroud)
您可以在几年内切换算法,增加轮数,并且pbkdf2_sha256.verify仍然可以根据存储在数据库中的哈希验证明文密码.
由于使用了随机盐,因此每次散列相同的密码不会给您相同的结果.如果攻击者获得密码哈希值,则盐可防止彩虹表攻击.基本上,不是计算,而是hash(password)计算类似的东西hash(salt + password).由于盐已经在上面的字符串中给出,你可能知道密码,你也会知道它的价值,salt + password你的生活将不再困难.但对于那些花费大量时间预先计算的攻击者来说hash(password),这些哈希值都不会有用,因为它们不会包含你的随机盐.
与评论中发布的示例一样,您无需执行任何特殊操作来验证密码:
pbkdf2_sha256.verify(password, user.hashed_password)
Run Code Online (Sandbox Code Playgroud)
pbkdf2_sha256.encrypt验证密码时无需拨打电话.pbkdf2_sha256.verify为你做所有这些.
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |