我不明白为什么Argon2需要一个salt,如果密码只需要Argon2作为一个KDF,那么密码就叫做Argon2。最后,密码和密码散列都不被存储。只有用KDF密钥加密的数据。在数据库中存储密码时,需要使用salt来防止彩虹表的攻击,这是合乎逻辑的。硬编码的盐是坏的,这也是合乎逻辑的。但是,如果Argon2被用作KDF,为什么不能将用户密码本身用作salt呢?(当然,这种盐不会与加密的数据一起存储;)也许我误解了盐类的概念.这给了我一个很好的概述,但它不能直接回答我的问题。
这里是背景:我正在创建一个应用程序,其中一些用户数据存储在一个CouchDB数据库中。这些数据应该在本地以及数据库中加密。对于原型,我们使用对称加密。程序如下:
问题是:随着文件数量的增加,对KDF的调用数量增加,性能受到严重影响。一份盐就能让这件事变得更容易。
发布于 2022-12-09 23:18:11
对于任何基于密码的密钥派生函数或密码哈希,您需要salt来防止在许多不同的用户或帐户中猜测相同的密码。在典型情况下,通过比较KDF的输出来验证密码;在这种情况下,验证密码是通过验证该用户加密的加密数据上的MAC或AEAD。
这样做在计算上是否有点困难呢?是。这不可能吗?不是的。您确实需要在这里使用salt,因为通常情况下,人们会选择错误的密码,而salt会使攻击变得更加困难。唯一不这样做的情况是,如果您为用户分配具有足够熵(例如令牌)的随机加密安全密码,并且他们使用密码管理器或其他秘密存储来存储这些密码。
但是,如果您使用相同的用户帐户加密多个文件,则可以使其变得更复杂,速度更快。您可以使用Argon2和每个用户的salt来生成一个512位的输出。然后,您可以使用每个文件的salt和Argon2输出(而不是秘密)作为输入到HKDF以生成密钥,并由AES-GCM对数据进行加密。HKDF是非常快的,所以您可以生成密钥和现在为许多,许多文件非常快。
你也可以使用类似于NaCl的crypto_box。生成一个公共私钥对。在Argon2i中使用每个用户的salt和密码来生成密钥,并使用AES-GCM (或任何安全算法)对私钥进行加密。然后,您可以使用公钥使用crypto_box加密您的文件,并且您只需要在解密期间使用Argon2来解密私钥。
https://crypto.stackexchange.com/questions/103194
复制相似问题