Passwords Java中带HMAC的PBKDF2

Passwords Java中带HMAC的PBKDF2,passwords,java,password-policy,pbkdf2,hmac,Passwords,Java,Password Policy,Pbkdf2,Hmac,我正在从事一个Java项目,我必须确保明文文件中保存的用户密码的机密性和完整性 为此,我将只在文件中写入密码的散列。更具体地说,我的意图是编写密码和随机salt的散列,再加上随机salt本身,以避免使用rainbow和lookup表。我还想使用PBKDF2进行键拉伸,以使散列的计算变得昂贵。 最后,我想使用键控哈希算法HMAC作为最后一层保护 我试图用Java代码实现我的想法,我发现了一些我在上面介绍的操作示例: private static byte[] pbkdf2(char[] passw

我正在从事一个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内部使用

其要点是重复应用具有以下特性的函数:

  • 它有两个论点
  • 它返回一个固定大小的值
  • 它实际上与伪随机函数没有区别
HMAC-SHA-1就是这样一个函数,也是一个常见的选择。PBKDF2还有其他变体,使用HMAC-MD5、HMAC-SHA-256或其他函数(但这些变体不在基本Java库中)

PBKDF2接受两个数据输入(加上一些配置输入):密码和salt。如果你想在计算中包含一个秘密值,PBKDF2的输入就是它的位置:不要在上面附加一个自定义方案(做你自己的加密就是做错事的秘诀)。将(所有帐户通用的秘密值)附加到salt(不同帐户的公共值)后

请注意。只有当散列和pepper秘密值存储在不同的位置时,它才有用——例如,如果散列在数据库中,而pepper位于磁盘文件中,该磁盘文件不会直接受到SQL注入攻击。

只需使用Jasypt即可