我理解密码的盐渍哈希是如何工作的,但我假设我还需要存储salt,username,KEY和encryptedpassword。我认为总的来说我只需要了解如何实现它,例如如何存储它,然后再如何重新生成密码。此外,如果有人能够解释为什么使用这个盐渍值更好,那么一个人难道不会在每个单词前面用盐进行字典攻击吗?
谢谢,
答案 0 :(得分:9)
目前还不清楚您要做的是:验证提供的密码是否正确(与系统登录一样);或实现密钥从密码派生的数据加密。
如果是后者(称为基于密码的加密),则应使用密钥派生函数,例如PBKDF2
。密钥派生函数接受salt和提供的用户密码,并生成可与AES等密码一起使用的密钥。
要加密,您将提示输入密码,生成随机盐,并使用KDF派生密钥。然后,您可以在合适的分组密码模式下使用该密钥来加密数据,并仅存储盐和加密数据(以及密码模式所需的任何IV)。
要解密,您需要提示输入密码,从文件中加载salt,然后重新导出密钥。然后,您将使用该密钥解密文件。
salt的目的是防止预计算优化应用于字典攻击。确实可以在盐已知的情况下执行暴力字典攻击,但KDF的设计速度足够慢,无需预先计算就无法实现。
答案 1 :(得分:1)
您应该使用哈希算法来存储密码,这是一种单向“加密”。然后,您可以只是对从用户获得的密码进行哈希处理,并与存储的哈希值进行比较。
出于安全原因,您应该在哈希中添加salt,以便更快地对您的哈希值进行彩虹表攻击。
在计算用户输入的哈希值时,您需要存储salt以便获得相同的哈希值。你应该以安全的方式储存盐。