【问题标题】:How to input key with "PBKDF2WithHmacSHA1" in Java如何在 Java 中使用“PBKDF2WithHmacSHA1”输入密钥
【发布时间】:2013-11-20 14:53:46
【问题描述】:

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

【问题讨论】:

    标签: java security hash hmac pbkdf2


    【解决方案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(...);
    

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2021-08-10
      • 2013-03-16
      • 2016-03-31
      • 1970-01-01
      相关资源
      最近更新 更多