我正在开发一个 Java 项目,我必须确保保存在明文文件中的用户密码的机密性和完整性。
为此,我将仅在文件中写入密码的哈希值。更具体地说,我的目的是编写密码的哈希值和随机盐,加上随机盐本身,以避免使用彩虹和查找表。我还想将密钥拉伸与 PBKDF2 一起使用,以使散列的计算成本高昂。
最后,我想使用密钥哈希算法 HMAC 作为最后一层保护。
我正在尝试在 Java 代码中实现我的想法,并且我找到了上面介绍的一些操作示例:
private static byte[] pbkdf2(char[] password, byte[] salt, int iterations, int bytes)
throws NoSuchAlgorithmException, InvalidKeySpecException
{
PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes * 8);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
return skf.generateSecret(spec).getEncoded();
}
我真正无法理解的是如何输入我的密钥作为 HMAC 算法使用的密钥,因为它似乎不是该函数的输入。我浏览了 Java 文档,但找不到我的问题的解决方案。
在这一点上,我不太确定我是否正确理解加密机制的不同部分是如何工作的,所以我会接受有关该主题的任何帮助。
我想我看到了这种混乱。您显然希望您的代码应用 PBKDF2,然后应用 HMAC-SHA-1。它不是这样工作的:HMAC-SHA-1 在 PBKDF2 内部使用。
要点PBKDF2 http://en.wikipedia.org/wiki/PBKDF2是重复应用具有以下属性的函数:
- 它需要两个参数;
- 它返回一个固定大小的值;
- 它实际上与伪随机函数无法区分。
HMAC-SHA-1 就是这样一个功能,也是一个常见的选择。 PBKDF2 还有其他变体,使用 HMAC-MD5、HMAC-SHA-256 或其他函数(但这些变体不在基本 Java 库中)。
PBKDF2 接受两个数据输入(加上一些配置输入):密码和盐。如果您想在计算中包含一个秘密值,PBKDF2 的输入就是合适的地方:不要在此基础上添加自定义方案(使用您自己的加密方法可能会导致错误)。追加pepper https://security.stackexchange.com/questions/41754/what-is-the-purpose-of-a-pepper(所有帐户共有的秘密值)到盐(帐户之间不同的公共值)。
注意胡椒的用处有限 https://security.stackexchange.com/questions/3272/password-hashing-add-salt-pepper-or-is-salt-enough。仅当哈希值和胡椒秘密值存储在不同的位置时,它才有用 - 例如,如果哈希值位于数据库中,而胡椒位于不易直接受到 SQL 注入攻击的磁盘文件中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)