如何输入密钥" PBKDF2WithHmacSHA1"在Java中

时间:2013-11-08 14:42:40

标签: java security hash hmac pbkdf2

我正在开发一个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文档,但是我无法找到解决问题的方法。

1 个答案:

答案 0 :(得分:1)

如果您谈论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(...);