PBKDF2WithHmacSHA512比。 PBKDF2WithHmacSHA1

时间:2013-10-13 18:09:20

标签: java pbkdf2 secret-key javax.crypto

我正在研究一个Java身份验证子系统,该子系统将数据库中的密码存储为PBKDF2生成的哈希值,我现在正在尝试决定是否应该使用SHA1或{ {1}}作为PFR。我仔细检查了两者的规格,但我们在数学上非常密集地跟随它。有更好的加密理解的人可以解释SHA512PBKDF2WithHmacSHA512的区别吗?

这是我正在尝试做的事情:

PBKDF2WithHmacSHA1

2 个答案:

答案 0 :(得分:48)

让我们一块一块地分解这个词:

PBKDF2--WithHmac--SHA512

让我们逐个讨论

  • <强> PBKDF2

    代表基于密码的密钥导数函数,它是PBKDF1的后继函数,用于实现伪随机函数,例如加密哈希,密码或HMAC到输入密码或密码以及盐值和多次重复该过程以生成派生密钥,然后可以将其用作后续操作中的加密密钥。

  • <强> HMAC

    代表密钥哈希消息认证码(HMAC)是用于计算涉及密码散列函数结合秘密密码密钥的消息认证码(MAC)的特定结构。任何加密散列函数都可以用于计算HMAC;结果MAC算法相应地称为HMAC-MD5或HMAC-SHA1。

  • <强> SHA512

    嗯,你知道的......:P

现在,回到你的问题,代码行:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

指定使用算法PDBKDF2WithHmacSHA1的keyFactory。你什么时候会这样做:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");

您告诉工厂使用算法PBDKF2WithHmacSHA512

基本上PBKDF2WithHmacSHA1PBKDF2WithHmacSHA512之间的主要区别在于:

  1. PBKDF2WithHmacSHA1生成160位的哈希长度
  2. PBKDF2WithHmacSHA512生成512位的哈希长度
  3. 因此后者更安全。但双方都有争论哪些足以加密。没有辩论。只是说。

    有关这两种算法的一些其他信息:

    1. <强> HMACSHA1

        

      HMACSHA1是一种键控哈希算法,由SHA1哈希函数构造,用作HMAC或基于哈希的消息   验证码。 HMAC进程将密钥与密钥混合   消息数据,用散列函数散列结果,混合即可   再次使用密钥哈希值,然后应用哈希值   第二次运作。输出散列的长度为160位。

    2. <强> HMACSHA512

        

      HMACSHA512是一种由关键字哈希算法构造而成   SHA-512哈希函数,用作基于哈希的消息   验证码(HMAC)。 HMAC进程混合了一个密钥   消息数据和散列结果。哈希值与哈希值混合   再次密钥,然后第二次哈希。输出哈希   长度为512位。

    3. 主要优势是HmacWith512HmacWith256更安全。例如,

      HMAC_SHA1("key","The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
      
      HMAC_SHA512("key","The quick brown fox jumps over the lazy dog") = 0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a
      

      差异非常大(如图所示)。希望能帮助到你。 :)

      编辑:正如OP提到的那样

      PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)
      

      参数keyLength用于指示密钥长度的首选项 用于可变密钥大小的密码。实际密钥大小取决于每个提供商的实现。因此,说做像

      这样的事情

      PBEKeySpec(password, salt, int 100, 512)并不意味着您将使用SHA1生成512的keyLength。它只是意味着。 SHA1最多支持160位。你不能超过这个。

      关于你的第二个问题,请看HMAC-SHA1。有许多陈述说如果你是一个长哈希,像SHA256这样的算法是相当不错的。

      另外,根据NSA:

        

      NSA指定“使用椭圆曲线公钥密码术”   FIPS-186-2中规定的256位素数模数椭圆曲线   和SHA-256适用于保护机密信息   到SECRET级别。使用384位素数模数椭圆曲线   和SHA-384是保护TOP SECRET所必需的   信息。

      我认为结合使用HMAC功能SHA512非常安全。

答案 1 :(得分:1)

SHA512属于SHA2系列加密哈希函数。由于SHA1具有理论上的弱点,并且SHA512稍微慢于SHA1(散列密码时速度越慢越好),应该通过SHA1选择SHA512(或任何SHA2系列)来进行散列密码。

实际上理解功能上的差异并不简单,但您可能更有可能在Crypto SE site上获得答案。