Знак HmacSHA256 - алгоритм не имеет значения? - PullRequest
2 голосов
/ 02 апреля 2019

Почему это всегда работает независимо от второго параметра 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 ]

2 голосов
/ 02 апреля 2019

Полагаю, это просто совпадение, потому что криптографическая архитектура Java основана на концепции провайдеров . Похоже, что стандартные JDK-провайдеры для Mac не проверяют алгоритм из 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 голос
/ 02 апреля 2019

Если вы посмотрите на код, вы увидите, что

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