Java 如何使用“输入”键输入;PBKDF2带HMACSHA1“;在爪哇

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

我正在从事一个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函数,您不需要提供密钥,它将根据输入创建一个密钥

如果您想使用PBKDF2为HMAC函数创建关键材质,那么下面的方法就可以了

初始化Mac函数的方法与使用密码的方法相同

使用上面的
pbkdf2
方法

byte[] key = pbkdf2(password, salt, 1000, 16)
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(key, "HmacSHA1");

byte[] macResult = mac.doFinal(...);

如果您讨论的是PBKDF2内部用于密钥拉伸的HMAC函数,则不需要提供密钥,它将根据输入创建一个密钥

如果您想使用PBKDF2为HMAC函数创建关键材质,那么下面的方法就可以了

初始化Mac函数的方法与使用密码的方法相同

使用上面的
pbkdf2
方法

byte[] key = pbkdf2(password, salt, 1000, 16)
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(key, "HmacSHA1");

byte[] macResult = mac.doFinal(...);