Python-使用scrypt存储密码的正确方法?
我不明白如何用scrypt存储散列密码 以下是一个例子:Python-使用scrypt存储密码的正确方法?,python,python-3.x,hash,password-protection,scrypt,Python,Python 3.x,Hash,Password Protection,Scrypt,我不明白如何用scrypt存储散列密码 以下是一个例子: import pyscrypt hashed = pyscrypt.hash(password = b"password", salt = b"seasalt", N = 1024, r = 1, p = 1,
import pyscrypt
hashed = pyscrypt.hash(password = b"password",
salt = b"seasalt",
N = 1024,
r = 1,
p = 1,
dkLen = 16)
print(hashed.hex()) #70ac953b777e24c4f41c4657eb9f03c2
hashed = pyscrypt.hash(password = b"password",
salt = b"seasalt",
N = 1024,
r = 2,
p = 1,
dkLen = 16)
print(hashed.hex()) #b00b951cd50675806c55d903dba9cbca
hashed = pyscrypt.hash(password = b"password",
salt = b"seasalt",
N = 1024,
r = 1,
p = 2,
dkLen = 16)
print(hashed.hex()) #7c3fa22552c8a9071da0e8c80a0a2767
在上面的例子中,我们可以看到散列是根据参数N,r,p
值而改变的
这是否意味着我也应该在数据库中保存N,r,p
值
当市场上有更强大的硬件可用时,我应该怎么做?例如,要求用户更改密码以便可以应用新的哈希函数或其他什么?最重要的是,您必须为每个用户存储
salt
因此,您的记录通常类似于:
username: scrypt,params,seasalt,89435389985698348998364
(您希望显式存储记录的类型,以防在迁移之前或之后使用其他机制)是的,您需要将用于生成哈希的参数与哈希一起存储。通常最容易将它们唯一地连接成字符串,例如
N | r | p | len | salt | hash
,或者JSON编码dict。您还必须为每个密码生成唯一的随机salt
用户登录时可以处理将来的升级。伪代码:
if login_successful:
if not params_up_to_date(hashed_password):
hashed_password = hash(entered_password)
# update database record
检查哈希密码的参数是否与当前使用的密码相同,如果不相同,则重新哈希刚刚在登录过程中使用的密码。用户可以通过这种方式逐步、透明地升级。为什么要使用此库而不是
passlib
,后者可以方便地存储和理解参数化和盐渍哈希。@Antti只是猜测,但passlib不支持scrypt。。。!?关于未来更新的观点很好。您介意告诉我如何将参数与代码连接起来吗。我被困在那里,头晕了。我的意思是你字面上的意思是使用:hash\u value\u to\u submit\u do\u db=(“|”)join([“N”、“r”、“p”、“len”、“salt”、“hash”])
。这就像bcrypt正在使用的一样,对吧?是的,就是这么简单。只要可以反转操作并再次从中提取原始的单独值,就可以了。