我对密码学领域有点陌生(完全是新的),可能真的需要你的指导。
请纠正我的理解,如下所述。
Argon2哈希生成器赢得了密码哈希竞争,因此被认为是目前安全散列密码的最佳解决方案。建议使用而不是bcrypt或pbkdf2。Argon2需要通过并行性因素、内存开销、迭代和哈希长度来进行额外的配置,以便在最有效的情况下使用。但是,默认参数通常都很好。Argon2还需要一个“salt”--这个salt是使用加密安全的伪随机数生成器(简称CSPRNG)生成的,但是这里可以使用任何合理的随机值。Argon2的某些实现(如这一个)允许将密钥和附加数据保密到函数中,但这些都是可选的,因此哈希的安全性并不是必需的。Blake3 )的结果也可以用作salt。Argon2哈希,使用RD的Blake3哈希作为saltArgon2哈希,使用电子邮件的Argon2哈希作为saltArgon2哈希提供的安全性,并且会使任何人,即使是那些直接访问数据库和源代码的人,都很难弄清楚用户的电子邮件和密码实际上是什么,但是验证用户的输入是否正确将变得非常困难。任何批评、评论、想法、意见(基于事实)--都是非常受欢迎的。
更正:正如Marc指出的,6.2。没有任何意义-这将使它(几乎)不可能查找电子邮件的注册用户。如果我们用6.2步代替。如果用户的电子邮件(比如费舍-耶茨洗牌 )被随机加扰,重复进行X次迭代,使用来自这一功能的随机生成器,再一次从电子邮件中派生种子号,那么其余的内容是否仍然有意义呢?
发布于 2020-06-04 19:00:33
( A)不要散列电子邮件。将其存储为纯文本或根本不存储。
如果打散,那么向上看将是不可能的。需要迭代数据库中的每一个记录。平均50%的记录每次都需要测试。如果有1 000 000名用户,应用程序每登录一次就需要检查平均500 000条记录。哈希需要花费很大。假设它需要1s。这意味着,检查一个单一的登录将需要50万s,这大约是6天。即使对于一个拥有1000名用户的小型数据库,每次用户登录时也需要500 S=8分钟以上的时间才能登录。没有用户会接受它。
( B)将登录ID存储为纯文本,与用户输入的完全相同,没有任何转换和混淆。
如果使用任何转换,则必须每次生成相同的结果,否则将无法在数据库中查找登录。如果结果总是相同的,那么攻击者也可以轻松地生成相同的代码。意思是,不是更安全,而是更模糊,因此更容易出错。
( C)在需要随机数据的地方,使用随机生成器,不要添加任何东西。
RD不是随机的。因此,Blake3(RD)也不是随机的。因此,盐不是随机的。相反,使用随机生成器。此外,增加复杂性或使算法更加模糊并不能使其更安全,甚至一点也不安全。
此外,不要将电子邮件地址或任何其他固定数据作为秘密的一部分。这些数据并不是真正的随机数据。每个用户或多或少都有一些这样的属性(没有人每天生成一个新的电子邮件地址)。这就是为什么这样的数据不能给出多少熵。但是使用它们使得算法更加模糊,给人一种虚假的安全感。
( D)尽量保持算法简单。
想想Kerckhoff的原理。增加默默无闻并不能提供更多的安全感。但是,更多的模糊性意味着实现中的更复杂,这使得实现更容易出错,因此实际上安全性更低。
( E)明确区分不同的目标。不要混在一起。
对秘密数据(密码)进行散列是一个目标。似乎你想保护个人数据,以便于识别一个人(电子邮件地址)。这是另一个目标。把它们混在一起是不好的。这导致了他们之间的依赖。试图达到一个目标会导致实现另一个目标的问题。在我们的例子中,电子邮件不应该是用于登录的秘密的一部分。此外,如果您想保密电子邮件,使用只有用户知道的密码(不一定与登录密码相同)对其进行加密。但是,您的应用程序也将无法使用此电子邮件地址,例如发送信息,以恢复被遗忘的密码。如果您的应用程序可以解密它,那么攻击者也可以轻松地解密它。意思是,要么按原样存储,要么以纯文本的形式存储,要么根本不存储。
<#>F)“最佳”并不意味着“已批准”。
的确,Argon2赢得了比赛。但在决定使用它之前,请考虑以下几点(这种情况并不经常发生,但仍然存在这种情况):
https://crypto.stackexchange.com/questions/81172
复制相似问题