让我们把这个词一个接一个地分解:
PBKDF2--WithHmac--SHA512
让我们一部分一部分地复习
-
PBKDF2
代表基于密码的密钥派生函数,它是PBKDF1的继任者,用于实现伪随机函数,如输入密码或密码的加密哈希、密码或HMAC以及salt值,并多次重复该过程以生成派生密钥,然后该派生密钥可在后续操作中用作加密密钥。
-
HMAC公司
代表密钥散列消息认证码(HMAC)是一种用于计算消息认证码的特定结构,该消息认证码涉及密码散列函数和秘密密码密钥。可以在HMAC的计算中使用任何加密散列函数;所得到的MAC算法相应地被称为HMAC-MD5或HMAC-SHA1。
-
沙512
好吧,你知道的..:P
现在,回到您的问题,代码行:
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
指定要使用算法的keyFactory
PDBKDF2WithHmacSHA1
。当你想做这样的事情时:
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
你告诉工厂使用算法
PBDKF2WithHmacSHA512
.
本质上
PBKDF2WithHmacSHA1
和
PBKDF2WithHmacSHA512
是不是:
-
这个
PBKDF2带HmacSHA1
将
生成160位的哈希长度
.
-
这个
PBKDF2带HmacSHA512
将
生成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:
美国国家安全局规定“使用
FIPS-186-2中指定的256位素模椭圆曲线
和SHA-256适用于保护机密信息
达到机密级别。384位素模椭圆曲线的使用
和SHA-384是保护绝密所必需的
信息
我认为将HMAC功能与SHA512结合使用是非常安全的。