【问题标题】:Python - Proper way to store passwords with scrypt?Python - 使用 scrypt 存储密码的正确方法?
【发布时间】:2015-11-18 14:43:53
【问题描述】:

我不明白我应该如何使用 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 值?

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

【问题讨论】:

  • 你为什么使用这个库而不是passlib,它可以很容易地存储和理解参数化和加盐的哈希值。
  • @Antti 只是猜测,但是 passlib 不支持 scrypt...!?

标签: python python-3.x hash password-protection scrypt


【解决方案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

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

【讨论】:

  • 关于未来更新的要点。您介意告诉我如何将参数与一段代码连接起来吗?我卡在那里,我在旋转我的头。我的意思是你的字面意思是使用一些东西:hash_value_to_submit_do_db = ('|'.join(["N","r","p","len","salt","hash"]))。这就像 bcrypt 使用的那样,对吧?
  • 是的,就这么简单。只要您可以反转操作并再次从中提取原始的单独值,就可以了。
【解决方案2】:

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

因此,您的记录通常会是这样的:

username: scrypt,params,seasalt,89435389985698348998364

(您想显式存储记录的类型,以防曾经使用过其他机制,更早用于迁移,或者更晚一般)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2010-10-24
    • 2013-05-08
    • 2019-03-30
    • 2020-02-14
    相关资源
    最近更新 更多