我正在尝试使用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
在这种情况下,我应该在数据库中存储什么?
请,你能帮我吗?我是这个新手,我有点迷路。
答案 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)
都不是。将以下内容保存为单个值:
“已编码”字段的输出具有误导性,因为您不能按原样使用它来进行密码检查(例如,用于生成哈希值),例如m = 262144,其中密码检查需要原始因子m = 18。
每次检查密码是否要启动操作系统进程?我不鼓励您这样做。我建议您使用一个库(C ++,Java等)。它们产生一个字符串,其中包含所有用“ $”连接和分隔的所有数据。
答案 2 :(得分:1)
我将type
,iterations
,memory
,parallelism
,hash
,salt
和相应的用户ID放入单独的列中并保留编码后的位,因为仅是所有属性连接在一起。如果它们在不同的列中,则与拆分和索引编码的字符串相比,您可以更轻松地引用属性。
另一种选择是只将编码后的字符串存储在1列中,但是正如我所说的,查看某些属性比较麻烦,因为您必须先拆分编码后的字符串,然后对其进行索引。