Хеширование с помощью HmacSHA256 возвращает неожиданный результат - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужно подписать сообщение MAC, используя алгоритм SHA-256.У меня есть код для генерации MAC, однако проверка на другом конце не удалась.Мне сказали, что значение, которое я вычисляю, неверно.

Вот мой код

    public static byte[] calculateMAC(byte[] _aiOutBufferForMacCalculation, String key) {
    try{

        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        byte[] mac_data=sha256_HMAC.doFinal(_aiOutBufferForMacCalculation);

        String result = "";
        for (final byte element : mac_data)
        {
            result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
        }
        System.out.println("Result:[" + result + "]");

        return mac_data;
    } catch (Exception _exception) {
        _exception.printStackTrace();
    }

    public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

   public static void main(String[] args) {
    String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
    String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


    byte[] data_for_mac = hexStringToByteArray(cadena);

    System.out.println(new String(data_for_mac));

    byte[]mac =  calculateMAC(data_for_mac,key);



}

}

В результате я вижу напечатанное: 0e01a8a96b30ae0a918865d1cef898ea4f96e18680fa9aae4c5d9902090c2f81

ожидаемое значение: 7684024da7fe89029965ac037a1ec94b21479c91cd8495e726fec924e84b0773

Я использовал несколько онлайн-инструментов, которые позволяют вводить шестнадцатеричную строку в качестве inputo для генерации хеша.Результат такой же, как и ожидалось, поэтому я подтвердил, что у моей проблемы.

Я не знаю, что я делаю по-другому или неправильно, кто-нибудь может помочь?Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

Из ваших параметров функции main я ожидаю, что ключ тоже является шестнадцатеричной строкой. Так что вам нужно позвонить hexStringToByteArray для этого тоже. getBytes() метод просто возвращает байты, он не будет преобразован из шестнадцатеричной строки.

Измените функцию calculateMAC на что-то вроде этого:

public static byte[] calculateMAC(byte[] _aiOutBufferForMacCalculation, byte[] key) {
    try{

        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
    ...
    }

а вам main вот так:

public static void main(String[] args) {
    String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
    String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


    byte[] data_for_mac = hexStringToByteArray(cadena);
    byte[] mac_key = hexStringToByteArray(key);

    // System.out.println(new String(data_for_mac)); <-- what is this????

    byte[] mac =  calculateMAC(data_for_mac,mac_key);
}

Я проверил, и с этими двумя небольшими изменениями вы получите ожидаемые результаты.

Кстати, я ожидаю, что вы, конечно, не опубликовали все важные ключи в этом примере кода, и вы просто используете фиктивный ключ. : D

...