我正在研究一个Java身份验证子系统,该子系统将数据库中的密码存储为PBKDF2
生成的哈希值,我现在正在尝试决定是否应该使用SHA1
或{ {1}}作为PFR。我仔细检查了两者的规格,但我们在数学上非常密集地跟随它。有更好的加密理解的人可以解释SHA512
与PBKDF2WithHmacSHA512
的区别吗?
这是我正在尝试做的事情:
PBKDF2WithHmacSHA1
答案 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
。
基本上PBKDF2WithHmacSHA1
和PBKDF2WithHmacSHA512
之间的主要区别在于:
PBKDF2WithHmacSHA1
将生成160位的哈希长度。PBKDF2WithHmacSHA512
将生成512位的哈希长度。因此后者更安全。但双方都有争论哪些足以加密。没有辩论。只是说。
有关这两种算法的一些其他信息:
<强> HMACSHA1 强>
HMACSHA1是一种键控哈希算法,由SHA1哈希函数构造,用作HMAC或基于哈希的消息 验证码。 HMAC进程将密钥与密钥混合 消息数据,用散列函数散列结果,混合即可 再次使用密钥哈希值,然后应用哈希值 第二次运作。输出散列的长度为160位。
<强> HMACSHA512 强>
HMACSHA512是一种由关键字哈希算法构造而成 SHA-512哈希函数,用作基于哈希的消息 验证码(HMAC)。 HMAC进程混合了一个密钥 消息数据和散列结果。哈希值与哈希值混合 再次密钥,然后第二次哈希。输出哈希 长度为512位。
主要优势是HmacWith512
比HmacWith256
更安全。例如,
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上获得答案。