我今天才刚开始使用.net的libsodium端口,输出长度参数有点让我感到困惑(我正在使用argon2i实现)。所用的位总是返回恒定的位长(例如MD5和128)。默认情况下,它返回128,就像令我惊讶的MD5一样。我总是用长度等于强度(尽管我意识到每种情况下都不存在1对1的相关性。)然后出现一个可变长度输出的问题,我应该选择什么:有了argon2,增加的位长真的会更安全吗?我随意选择了512位,但是我不知道这是否好。

第二个但又不相关的问题是,您是否认为应该将参数(可以更改哈希值)以及密码和salt一起存储在数据库中。例如opsLimit,memLimit,outputLenght等...

评论

只有达到极限,更多的总会更好。

@SEJPM,所以对于Aargon2i,您认为128(默认值)还可以,还是我选择的值(512)更好?我不知道这种特定算法的限制是什么。

您可能会考虑可能有多少用户。存储许多512位哈希将比128位哈希消耗更多的磁盘空间。考虑到这些天的存储价格以及您最终可能拥有多少用户,可能不必担心,但也许要考虑一下。

#1 楼

您需要考虑最弱的链接属性:安全系统永远不会比其最弱的链接更强大。由于Argon2是基于密码的功能,因此此处的薄弱环节将成为用户密码的优势。如果密码的熵值小于此值,那么选择较长的输出长度将无济于事。

这样想:如果哈希函数是安全的,则攻击者可以通过两种方式来攻击密码:


使用愚蠢的蛮力尝试查找一个用户密码的原像。
利用有关用户习惯的知识,在不太可能的密码之前猜测出更多可能的密码。 >
更长的输出可能会使#1变得更难,但是一旦您使#1变得足够困难,则#2就会变成简单的路径,攻击者将尝试这样做。因此Argon2的作者对128位散列的建议听起来不错,因为只有在您的用户密码是疯狂的熵的情况下,才可能限制128位输出的唯一情况,例如: />长度为20或更多(6.6位/字符)的ASCII可打印的统一随机密码;
长度为40位或更多的PIN码,随机地(3.3位/数字)统一选择;
11字或更长的Diceware密码短语(12.9位/字);
12个单词或更长的XKCD“正确的电池钉书钉”密码(2,048个单词词典,随机选择的单词)。

如果您用户可以指望选择功能强大的密码,而您一开始就不需要专门的密码哈希功能!您应该将参数(可以更改哈希值)以及密码和盐存储在数据库中。例如opsLimit,memLimit,outputLenght等...


是的,应该存储它们。例如,请注意,Argon2命令行实用程序(可从Argon2存储库中获得)会生成将其集成的验证标签(此示例中来自链接的“编码”字段):

$ echo -n "password" | ./argon2 somesalt -t 2 -m 16 -p 4 -l 24
Type:           Argon2i
Iterations:     2
Memory:         65536 KiB
Parallelism:    4
Hash:           45d7ac72e76f242b20b77b9bf9bf9d5915894e669a24e6c6
Encoded:        $argon2i$v=19$m=65536,t=2,p=4$c29tZXNhbHQ$RdescudvJCsgt3ub+b+dWRWJTmaaJObG
0.188 seconds
Verification ok



再考虑一下,我想我明白为什么如果我处于你的位置会感到困惑。如果默认的128位长度很好,并且延长它的长度并不能真正提供更高的安全性,那么为什么该功能允许我选择更长的输出长度?

好吧,原因是Argon2有两个不同的用途:


密码验证
密钥派生

长输出在密码验证中没有用,如上所述。在密钥派生案例中很有用。一个示例情况,您想要类似的事情是基于密码的加密,其中您正在执行类似的操作,例如使用AES-256加密文件,但是您没有让用户管理原始AES密钥,而是尝试变得更友好并让他们使用密码代替。例如,这就是GnuPG的对称加密模式的工作方式(尽管它不使用Argon2)。在这种情况下,由于您的密码需要256位密钥,因此您需要能够生成256位密钥用户密码中的位密钥。因此,可选的输出长度使您可以满足要求。

请注意,最弱链接属性仍然适用于此,因此在那种情况下,即使您使用的是256位加密,密码仍然是最弱链接。较长的输出长度允许您执行的操作是匹配256位密码所提出的技术要求,并为您的用户提供选择在该安全级别上有效的密码短语的选项-很少有人会这样做(例如, 40个字符的随机ASCII密码!)。

评论


$ \ begingroup $
好答案。编码形式的名称是Modular Crypt Format,它是一种用于密码哈希存储的半标准形式。使用libsodium的ArgonHashString获得(我希望)完全相同的格式是个好主意。
$ \ endgroup $
–otus
16年8月9日在6:49

#2 楼

是的,绝对存储与输出一起使用的参数值。这为您提供了加密敏捷性,以便您以后可以轻松更改值,并且仍然易于与现有值兼容。