Intereting Posts
PHP-флеш, который работает … даже в Nginx есть что-то вроде isset php в javascript / jQuery? Странное поведение с маршрутизацией и гипертекстом Как сбросить функцию Zend rememberMe при каждом автоматическом входе в систему? Установить динамический базовый url в CodeIgniter PHP / SSH regex script / command для удаления идентичного кода вредоносного кода из многих файлов mysqli + xdebug точка останова после закрытия оператора приводит к многочисленным предупреждениям Последний идентификатор вставки не возвращается Дата и время в графике Google из базы данных Как использовать переменную функции в другой функции того же класса -Codeigniter не может вставить русский текст в базу данных mysql Cakephp-3.x: Как изменить тип данных выбранного псевдонима? Regex / DOMDocument – сопоставление и замена текста не в ссылке Можно ли передавать параметры по ссылке с помощью call_user_func_array ()? Произошла ошибка клиента: Не удалось создать каталог хранения: / tmp / Google_Client / 00

java, эквивалентный hmac-SHA1 php

Я ищу эквивалент java для этого вызова php:

hash_hmac('sha1', "test", "secret") 

Я пробовал это, используя java.crypto.Mac , но они не согласны:

 String mykey = "secret"; String test = "test"; try { Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec secret = new SecretKeySpec(mykey.getBytes(),"HmacSHA1"); mac.init(secret); byte[] digest = mac.doFinal(test.getBytes()); String enc = new String(digest); System.out.println(enc); } catch (Exception e) { System.out.println(e.getMessage()); } 

Выходы с ключом = «секрет» и test = «тест», похоже, не совпадают.

На самом деле они согласны.
Поскольку Ханс Догген уже заметил, PHP выводит дайджест сообщения с использованием шестнадцатеричной нотации, если вы не установите для параметра raw output значение true.
Если вы хотите использовать одну и ту же нотацию в Java, вы можете использовать что-то вроде

 for (byte b : digest) { System.out.format("%02x", b); } System.out.println(); 

для форматирования вывода соответственно.

Вы можете попробовать это в Java:

 private static String computeSignature(String baseString, String keyString) throws GeneralSecurityException, UnsupportedEncodingException { SecretKey secretKey = null; byte[] keyBytes = keyString.getBytes(); secretKey = new SecretKeySpec(keyBytes, "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(secretKey); byte[] text = baseString.getBytes(); return new String(Base64.encodeBase64(mac.doFinal(text))).trim(); } 

Это моя реализация:

  String hmac = ""; Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec secret = new SecretKeySpec(llave.getBytes(), "HmacSHA1"); mac.init(secret); byte[] digest = mac.doFinal(cadena.getBytes()); BigInteger hash = new BigInteger(1, digest); hmac = hash.toString(16); if (hmac.length() % 2 != 0) { hmac = "0" + hmac; } return hmac; 

Мне кажется, что PHP использует HEX-нотацию для байтов, которые производит Java (1a = 26), но я не проверял все выражение.

Что произойдет, если вы запустите массив байтов через метод на этой странице?

Не проверял его, но попробуйте следующее:

  BigInteger hash = new BigInteger(1, digest); String enc = hash.toString(16); if ((enc.length() % 2) != 0) { enc = "0" + enc; } 

Это моментальный снимок из моего метода, который делает java md5 и sha1 match php.

Моя реализация для HmacMD5 – просто измените алгоритм на HmacSHA1:

 SecretKeySpec keySpec = new SecretKeySpec("secretkey".getBytes(), "HmacMD5"); Mac mac = Mac.getInstance("HmacMD5"); mac.init(keySpec); byte[] hashBytes = mac.doFinal("text2crypt".getBytes()); return Hex.encodeHexString(hashBytes); 

Таким образом, я мог бы получить ту же строку, что и с hash_hmac в php

 String result; try { String data = "mydata"; String key = "myKey"; // Get an hmac_sha1 key from the raw key bytes byte[] keyBytes = key.getBytes(); SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1"); // Get an hmac_sha1 Mac instance and initialize with the signing key Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); // Compute the hmac on input data bytes byte[] rawHmac = mac.doFinal(data.getBytes()); // Convert raw bytes to Hex byte[] hexBytes = new Hex().encode(rawHmac); // Covert array of Hex bytes to a String result = new String(hexBytes, "ISO-8859-1"); out.println("MAC : " + result); } catch (Exception e) { }