Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-使用scrypt存储密码的正确方法?_Python_Python 3.x_Hash_Password Protection_Scrypt - Fatal编程技术网

Python-使用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,

我不明白如何用scrypt存储散列密码

以下是一个例子:

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正在使用的一样,对吧?是的,就是这么简单。只要可以反转操作并再次从中提取原始的单独值,就可以了。