让我们逐个分解这个词:
PBKDF2--WithHmac--SHA512
让我们逐个部分地回顾一下
-
PBKDF2
代表基于密码的密钥派生函数,PBKDF1 的后继函数,用于实现伪随机函数,例如加密哈希、密码或 HMAC 到输入密码或密码短语以及 salt 值,并多次重复该过程以生成派生密钥,然后可以在后续操作中将其用作加密密钥。
-
断续器
代表密钥哈希消息身份验证代码 (HMAC) 是用于计算消息身份验证代码 (MAC) 的特定构造,该代码涉及加密哈希函数与秘密加密密钥的组合。任何加密哈希函数,都可用于计算HMAC;由此产生的MAC算法相应地称为HMAC-MD5或HMAC-SHA1。
-
SHA512
嗯,你知道的。:P
现在,回到你的问题,代码行:
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
指定键工厂以使用算法 。当你做这样的事情时:PDBKDF2WithHmacSHA1
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
你告诉工厂使用算法。PBDKF2WithHmacSHA512
本质上,和 之间的主要区别在于:PBKDF2WithHmacSHA1
PBKDF2WithHmacSHA512
- 将生成 160 位的哈希长度。
PBKDF2WithHmacSHA1
- 将生成 512 位的哈希长度。
PBKDF2WithHmacSHA512
因此,后者更安全。但是双方都有争论,关于哪个足以加密。没有辩论。只是说。
有关这两种算法的一些其他信息:
-
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。它只是意味着。SHA1 最多支持 160 位。你不能超过这个。
至于你的第二个问题,看看HMAC-SHA1。有很多语句说,如果你的长哈希,像这样的算法是相当不错的。SHA256
此外,根据国家安全局:
NSA 指定“使用 FIPS-186-2 和 SHA-256 中指定的 256 位素模量椭圆曲线的椭圆曲线公钥加密适用于保护机密信息,直至机密级别。使用384位素模量椭圆曲线和SHA-384对于保护绝密信息是必要的。
我认为将HMAC函数与SHA512结合使用是相当安全的。