1

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

4

1 回答 1

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(...);
于 2013-11-08T15:22:39.970 回答