Как указать ключ HMAC как шестнадцатеричный в Java
Я могу успешно получить 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 =
Тем не менее, я хотел бы получить это:
HMAC: eVXBY4RZmFQcOHHZ5FMRjDLOJ8vCuVGTjy7cHN7pqfo =
Я попробовал онлайн-инструмент, и похоже, что разница между моим кодом и онлайн-инструментом заключается в том, что я работаю с текстом типа ключа.
Тестовые значения:
строковые данные = "5515071604000fAIkwJtkeiA:APA91bH_Pb5xB2lrmKWUst5xRuJ3joVE-sb9KoT0zXZuupIEfdHjii-cODj-JMnjyy7hFJUbIRAre9o2yaCU43KaFDmxKlhJhE36Dw0bZ2VntDUn_Zd1EJBuSyCYiUtmmkHfRvRy3hIb";
Ключ строки = "fc67bb2ee0648a72317dcc42f232fc24f3964a9ebac0dfab6cf47521e121dc6e";
getHac ("5515071604000fAIkwJtkeiA: APA91bH_Pb5xB2lrmKWUst5xRuJ3joVE-sb9KoT0zXZuupIEfdHjii-cODj-JMnjyy7hFJUbIRAre9o2yaCU43KaFDmxKlhJhE36Dw0bZ2VntDUn_Zd1EJBuSyCYiUtmmkHfRvRy3hIb", "fc67bb2ee0648a72317dcc42f232fc24f3964a9ebac0dfab6cf47521e121dc6e"));
выполнение моего метода возврата
9rH0svSCPHdbc6qUhco + nlkt2O7HE0rThV4M9Hbv5aY =(онлайн возвращает то же значение с выбранным текстом типа ключа)
и я ожидал
eVXBY4RZmFQcOHHZ5FMRjDLOJ8vCuVGTjy7cHN7pqfo =(онлайн возвращает то же значение с выбранным шестнадцатеричным типом ключа)
1 ответ
Предполагая, что вы используете Apache Commons Codec 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=