如何在我的数据库中存储Argon2密码?

时间:2019-12-22 11:24:24

标签: hash passwords

我正在尝试使用Argon2算法将用户密码存储在数据库中。

这是我通过使用它获得的:

$echo -n "password" | argon2 "smallsalt" -id -t 4 -m 18 -p 4
Type:           Argon2id
Iterations:     4
Memory:         262144 KiB
Parallelism:    4
Hash:           cb4447d91dd62b085a555e13ebcc6f04f4c666388606b2c401ddf803055f54ac
Encoded:        $argon2id$v=19$m=262144,t=4,p=4$c21hbGxzYWx0$y0RH2R3WKwhaVV4T68xvBPTGZjiGBrLEAd34AwVfVKw
1.486 seconds
Verification ok

在这种情况下,我应该在数据库中存储什么

  • 上面显示的“已编码”值?
  • 上面显示的“哈希”值?
  • 两者都不是,但是另一种解决方案?

请,你能帮我吗?我是这个新手,我有点迷路。

3 个答案:

答案 0 :(得分:3)

我参加聚会有点晚了,但我不同意之前的答案。
您应该存储该字段:Encoded
$argon2id$.... 值。

(至少如果您使用具有 verify() 函数的普通 Argon2 库。 然而,它看起来不像 man-page for argon2 命令那样做。

只有当你被命令行卡住时,你才应该考虑单独存储每个字段。)

$argon2id$ 编码的哈希
argon2 编码的哈希值与其老表亲 bcrypt's syntax 相同。

编码的散列包括用户登录时验证散列所需的所有内容。

这很可能是未来证明。当更新更好的 argon2 出现时:您可以升级您的单列散列密码。就像您可以检测 bcrypt 的 $2a$-hashes,并将它们重新散列为 $argon2id$-hashes 一样,下次用户登录时。(如果您从 bcrypt 移动到 agron2。)

TL;DR
将 $ 编码的值 encoded_hash 存储在您的数据库中。
使用 argon2.verify(password, encoded_hash) 验证密码是否正确。

不要理会散列中的所有值。让图书馆为你做这件事。 :)

答案 1 :(得分:2)

都不是。将以下内容保存为单个值:

  • 算法ID(例如argon2id)
  • 迭代次数(4)
  • 内存使用系数(18)
  • 并行性(4)

“已编码”字段的输出具有误导性,因为您不能按原样使用它来进行密码检查(例如,用于生成哈希值),例如m = 262144,其中密码检查需要原始因子m = 18。

每次检查密码是否要启动操作系统进程?我不鼓励您这样做。我建议您使用一个库(C ++,Java等)。它们产生一个字符串,其中包含所有用“ $”连接和分隔的所有数据。

答案 2 :(得分:1)

我将typeiterationsmemoryparallelismhashsalt和相应的用户ID放入单独的列中并保留编码后的位,因为仅是所有属性连接在一起。如果它们在不同的列中,则与拆分和索引编码的字符串相比,您可以更轻松地引用属性。

另一种选择是只将编码后的字符串存储在1列中,但是正如我所说的,查看某些属性比较麻烦,因为您必须先拆分编码后的字符串,然后对其进行索引。