签署 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 {