我正在进行一个Java项目,我必须确保用户密码保存在明文文件中的保密性和完整性。
为此,我将只在文件中写入密码的散列。更具体地说,我的意图是编写密码和随机salt的散列,再加上随机salt本身,以避免使用rainbow和lookup表。我还想使用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的要点是重复应用具有以下特性的函数:
HMAC-SHA-1就是这样一个函数,也是一个常见的选择。PBKDF2还有其他变体,使用HMAC-MD5、HMAC-SHA-256或其他函数(但这些变体不在基本Java库中)。
PBKDF2接受两个数据输入(加上一些配置输入):密码和盐。如果你想在计算中包含一个秘密值,PBKDF2的输入是合适的地方:不要在此基础上添加自定义方案(做你自己的加密是做错的方法)。将胡椒(所有账户共有的秘密值)附加到盐(账户之间不同的公共值)中。
请注意,胡椒的用处有限。只有当散列和胡椒秘密值存储在不同的地方时才有用-
问题内容: 2019年更新:自Bouncycastle 1.60起,Bouncycastle现在支持PBKDF2-HMAC- SHA256 JAVA是否有PBKDF2-HMAC-SHA256的可靠实现? 我曾经使用bouncycastle进行加密,但是它不提供PBKDF2WithHmacSHA256’。 我不想自己写加密模块。 您能推荐任何其他库或算法吗(如果我可以坚持使用bouncycastle
2019年更新:自Bouncycastle 1.60起,Bouncycastle现在支持PBKDF2-HMAC-SHA256 PBKDF2-HMAC-SHA256对于Java是否有可靠的实现? (以下是bouncycastle支持的算法)http://www.bouncycastle.org/specifications.html
NIST网站说,由于政府资金不足,NIST已经关闭。SHA-3是否有可能最终被接受? BouncyCastle库有一个SHA-3的实现,其摘要结果与wikipedia文章中发布的示例相同(我对此进行了测试)。既然最终的标准没有得到认可,这还能信任吗?维基百科说这可能会被改变,但怎么改变呢?因为最终的算法似乎不会被改变(否则就是另一种算法)。 这里有人指出,应该避免将PBKDF2与SHA-3一起用于
使用Express.js框架和密码与pbkdf2散列密码我读到默认算法是HMAC-SHA1,但我不明白为什么它没有升级到其他家族或SHA之一。 我们提供的keylen是我们想要的SHA的变体吗?像SHA-256,512等等? HMAC如何改变输出? 最后,当SHA1断开时,它是否足够坚固? 抱歉,如果我把事情搞混了。
我正在写一个Django应用程序,需要与现有的Java播放框架应用程序一起工作。Play应用程序使用PasswordHash.java来存储密码。它以冒号分隔的格式存储密码。每个哈希都存储为::。 例如,下面是密码“测试”的条目: 在这里,我们可以通过拆分字符串并找到: 迭代次数: 盐: PBKDF2哈希:。 我修改了Django的check_密码机制以与此格式兼容,但发现它认为密码不正确。我用了
问题内容: 我从http://tools.ietf.org/html/rfc6238借用了HMAC- SHA1 Java代码,并稍加修改以对其进行硬编码,以使用一个具有已知输出的已知密钥/消息对。 然后,我尝试在Python中编写相同的代码以验证结果,但是在Python和Java中获得了不同的值。 已知Java值很好。 Java代码: Python代码: 运行Java的结果: 运行Python的结