登录HmacSHA256-算法无关吗?

时间:2019-04-02 09:43:00

标签: java cryptography java-security

为什么无论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()));

问题是:为什么我通过的东西无关紧要?无论我作为第二个参数(算法名称)传递什么,代码始终可以正常工作。

2 个答案:

答案 0 :(得分:2)

我认为这只是一个巧合,因为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;

}

答案 1 :(得分:1)

如果您查看代码,将会看到

 public SecretKeySpec(byte[] key, String algorithm) {
      ...
      this.algorithm = algorithm;

和标题

@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 {