Java HmacSHA256 с ключом

Я пробовал несколько ссылок из stackru, чтобы получить HmacSHA256 с ключом для работы с Java, но я всегда получаю

 func check(body: String) -> String {
    let hash = body.hmac(HMACAlgorithm.sha256, key: Router.sigKey)
    print("SIG: " + Router.sigKey)
    print("result of hash. \(hash)")
    return hash
}

Эта функция возвращает хеш с ключом от заданной строки. Ключ был: 0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6

Строка была: пример

Результат: 27effb76c97022497e25d3a5d7e823462f212a82d9ebba35f179071568b0c335

Когда я использую этот веб-сайт, чтобы проверить, хорош ли мой SHA256 с тем же ключом, он возвращает тот же ответ, поэтому я знаю, что мой код в swift хорош. Но когда я пытаюсь сделать это в Java, вот исходный код.

public static String HMAC_SHA(){
    try {
        String secret = "0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6";
        String message = "example";
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        String hash = android.util.Base64.encodeToString(sha256_HMAC.doFinal(message.getBytes()), Base64.URL_SAFE);
        return new String(Hex.encodeHex(hash.getBytes()));
    }
    catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

Он возвращает это: 4a2d5f3764736c77496b6c2d4a644f6c312d676a526938684b6f4c5a36376f3138586b4846576977777a553d0a

Что даже не похоже на быстрый вывод. Как я могу достичь того же результата с Java из приведенного выше кода Swift, это будет очень полезно!

2 ответа

    String key = "0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6";
    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    sha256_HMAC.init(new SecretKeySpec(key.getBytes(), "HmacSHA256"));
    byte[] result = sha256_HMAC.doFinal("example".getBytes());
    System.out.println (DatatypeConverter.printHexBinary(result));
    // ONLY CONVERT TO HEX (= SWIFT) NOT FIRST TO BASE64

результат по запросу

 27EFFB76C97022497E25D3A5D7E823462F212A82D9EBBA35F179071568B0C335

Ваш ключ содержит значения, превышающие значение 127 и, Mac а также SecretKeySpec использование bytes, который в Java может содержать значения от -128 до 127.


В алгоритме HmacSHA256 ключ интерпретируется как строка шестнадцатеричных значений. В случае вашего секрета десятичные значения этого ключа:3,147,233,68,238,129,8,187,102,252,159,164,249,159,156,134,36,129,233,224,81,158,24,35,43,166,27,7,103,238,232,198

Как видите, некоторые из них имеют значение более 127. При создании SecretKeySpec объект и при выполнении расчетов в пределах Mac класс, Java использует byte[] хранить эту и связанные последовательности. В Java byte может содержать значения от -128 до 127, что означает, что при сохранении этого секрета значения> 127 будут "перевернуты" и обеспечат, что последующие вычисления не будут идти так, как вы ожидаете.

В случае Swift (и с C++, Ruby и другими языками) преобразование из шестнадцатеричного в байтовое происходит без потери фактического значения.

Другие вопросы по тегам