签署 HmacSHA256 - 算法无关紧要吗?
Sign HmacSHA256 - is algorithm irrelevant?
为什么不管 SecretKeySpec
的第二个参数,它总是有效?它不应该是一个有效的算法名称吗?谢谢
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "it does not matter what I put here. why?");
sha256_HMAC.init(secret_key);
String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
问题是:为什么我通过的东西无关紧要?无论我作为第二个参数(算法名称)传递什么,代码总是能正常工作。
我想这只是巧合,因为 Java 密码体系结构是基于 providers 的概念。 Mac
的默认 JDK 提供程序似乎不检查 SecretKeySpec
中的算法,而是完全依赖于 Mac.algorithm
字段中保存的算法。
您仍然应该在 SecretKeySpec
中设置正确的算法,因为没有什么可以阻止提供商检查密钥的算法。例如,如果您查看 Mac.chooseProvider(Key key, AlgorithmParameterSpec params)
私有方法,它会将密钥传递给外部代码:
// if provider says it does not support this key, ignore it
if (s.supportsParameter(key) == false) {
continue;
}
如果您查看代码,您会发现
public SecretKeySpec(byte[] key, String algorithm) {
...
this.algorithm = algorithm;
和 header
@throws IllegalArgumentException
* if the key data or the algorithm name is null or if the key
* data is empty.
所以SecretKeySpec
不关心算法。
当您初始化 MAC 时,您只会收到错误消息
* @exception InvalidKeyException if the given key is inappropriate for
* initializing this MAC.
public final void init(Key key) throws InvalidKeyException {
为什么不管 SecretKeySpec
的第二个参数,它总是有效?它不应该是一个有效的算法名称吗?谢谢
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "it does not matter what I put here. why?");
sha256_HMAC.init(secret_key);
String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
问题是:为什么我通过的东西无关紧要?无论我作为第二个参数(算法名称)传递什么,代码总是能正常工作。
我想这只是巧合,因为 Java 密码体系结构是基于 providers 的概念。 Mac
的默认 JDK 提供程序似乎不检查 SecretKeySpec
中的算法,而是完全依赖于 Mac.algorithm
字段中保存的算法。
您仍然应该在 SecretKeySpec
中设置正确的算法,因为没有什么可以阻止提供商检查密钥的算法。例如,如果您查看 Mac.chooseProvider(Key key, AlgorithmParameterSpec params)
私有方法,它会将密钥传递给外部代码:
// if provider says it does not support this key, ignore it
if (s.supportsParameter(key) == false) {
continue;
}
如果您查看代码,您会发现
public SecretKeySpec(byte[] key, String algorithm) {
...
this.algorithm = algorithm;
和 header
@throws IllegalArgumentException
* if the key data or the algorithm name is null or if the key
* data is empty.
所以SecretKeySpec
不关心算法。
当您初始化 MAC 时,您只会收到错误消息
* @exception InvalidKeyException if the given key is inappropriate for
* initializing this MAC.
public final void init(Key key) throws InvalidKeyException {