Python - 使用scrypt存储密码的正确方法吗?

时间:2015-11-18 14:43:54

标签: 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,
                       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值?

如果市场上有更强大的硬件,我该怎么办?例如,要求用户更改密码,以便可以应用新的哈希函数或其他什么?

2 个答案:

答案 0 :(得分:1)

是的,您需要将用于生成哈希的参数与哈希一起存储。通常最简单的方法是将它们唯一地连接成一个字符串,例如N|r|p|len|salt|hash,或者也许JSON编码一个字典。您还必须为每个密码生成一个唯一的随机盐。

用户登录时可以处理未来的升级。伪代码:

if login_successful:
    if not params_up_to_date(hashed_password):
        hashed_password = hash(entered_password)
        # update database record

检查散列密码的参数是否与您当前使用的密码相同,如果不是,请重新登录您在登录过程中使用的密码。用户可以通过这种方式逐步,透明地升级。

答案 1 :(得分:0)

最重要的是,您必须为每个用户存储salt

通常,您的记录将类似于:

username: scrypt,params,seasalt,89435389985698348998364

(您希望显式存储记录的类型,以防某些其他机制被使用,之前用于迁移,或稍后一般)