Как указать ключ HMAC как шестнадцатеричный в Java - PullRequest
0 голосов
/ 04 января 2019

Я могу успешно получить HMAC SHA256, используя следующий код:

 public static String getHac(String dataUno,  String keyUno) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {

         SecretKey secretKey = null;    
         Mac mac = Mac.getInstance("HMACSHA256");

         byte[] keyBytes = keyUno.getBytes("UTF-8");     

         secretKey = new SecretKeySpec(keyBytes,mac.getAlgorithm());

         mac.init(secretKey);   

         byte[] text = dataUno.getBytes("UTF-8");

         System.out.println("Hex encode: " + Hex.encode(keyUno.getBytes()));

         byte[] encodedText = mac.doFinal(text);    
         return new String(Base64.encode(encodedText)).trim();

    }

, что дает:

HMAC: 9rH0svSCPHdbc6qUhco + nlkt2O7HE0rThV4M9Hbv5aY =

* 1007 ОднакоЯ хотел бы получить это:

HMAC: eVXBY4RZmFQcOHHZ5FMRjDLOJ8vCuVGTjy7cHN7pqfo =

Я попробовал онлайн-инструмент , и похоже, что разница между моим кодом и онлайн-инструментом заключается в том, что я работаюс текстом типа ключа

1015 * Тестовые значения: 1019 * Строка данных =. "5515071604000fAIkwJtkeiA: APA91bH_Pb5xB2lrmKWUst5xRuJ3joVE-sb9KoT0zXZuupIEfdHjii-cODj-JMnjyy7hFJUbIRAre9o2yaCU43KaFDmxKlhJhE36Dw0bZ2VntDUn_Zd1EJBuSyCYiUtmmkHfRvRy3hIb"; 1021 *Строка ключ = "fc67bb2ee0648a72317dcc42f232fc24f3964a9ebac0dfab6cf47521e121dc6e"; 1023 * getHac ( "5515071604000fAIkwJtkeiA: APA91bH_Pb5xB2lrmKWUst5xRuJ3joVE-sb9KoT0zXZuupIEfdHjii-cODj-JMnjyy7hFJUbIRAre9o2yaCU43KaFDmxKlhJhE36Dw0bZ2VntDUn_Zd1EJBuSyCYiUtmmkHfRvRy3hIb", «fc67bb2ee0648a72317dcc42f232fc24f3964a9ebac0dfab6cf47521e121dc6e ")); 1025 * выполнение моего метода возврата 1027 * 9rH0svSCPHdbc6qUhco + nlkt2O7HE0rThV4M9Hbv5aY = (онлайн возвращает то же значение с ключом текстом типа выбранного) 1031 * и я ожидал

eVXBY4RZmFQcOHHZ5FMRjDLOJ8vCuVGTjy7cHN7pqfo = (онлайн возвращает то же значение с выбранным шестнадцатеричным типом ключа)

1 Ответ

0 голосов
/ 04 января 2019

Предполагая, что вы используете кодек Apache Commons 1.11, используйте следующее:

byte[] keyBytes = Hex.decodeHex(keyUno);

Метод getHac

Ваш код, слегка измененный, выглядит следующим образом:

public static String getHac(String dataUno,  String keyUno) 
        throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException, DecoderException {

    SecretKey secretKey;
    Mac mac = Mac.getInstance("HMACSHA256");

    byte[] keyBytes = Hex.decodeHex(keyUno);

    secretKey = new SecretKeySpec(keyBytes, mac.getAlgorithm());

    mac.init(secretKey);

    byte[] text = dataUno.getBytes("UTF-8");

    byte[] encodedText = mac.doFinal(text);
    return new String(Base64.encodeBase64(encodedText)).trim();
}

Тест

Этот метод Java дает ожидаемый результат:

eVXBY4RZmFQcOHHZ5FMRjDLOJ8vCuVGTjy7cHN7pqfo=
...