HMC SHA1-хеш - Java производит другой хеш-вывод, чем C #
Это продолжение доэто вопрос, но я пытаюсь перенести код C # на Java вместо кода Ruby на C #, как это было в соответствующем вопросе. Я пытаюсь проверить зашифрованныйподпись возвращается из API Recurly.js является действительным. К сожалению, у Recurly нет библиотеки Java для помощи в проверке, поэтому я должен сам выполнить проверку подписи.
По смежному вопросу выше (это), следующий код C # может создать хеш, необходимый для проверки подписи, возвращаемой из Recurly:
var privateKey = Configuration.RecurlySection.Current.PrivateKey;
var hashedKey = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(privateKey));
var hmac = new HMACSHA1(hashedKey);
var hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(dataToProtect));
return BitConverter.ToString(hash).Replace("-", "").ToLower();
Recurly предоставляет следующий пример данных об ихподпись страница документации:
незашифрованное подтверждающее сообщение: [1312701386, транзакция создана, [код_счета: ABC, сумма_ин_центов: 5000, валюта: USD]]
закрытый ключ: 0123456789ABCDEF0123456789ABCDEF
итоговая подпись: 0f5630424b32402ec03800e977cd7a8b13dbd153-1312701386
Вот моя реализация Java:
String unencryptedMessage = "[1312701386,transactioncreate,[account_code:ABC,amount_in_cents:5000,currency:USD]]";
String privateKey = "0123456789ABCDEF0123456789ABCDEF";
String encryptedMessage = getHMACSHA1(unencryptedMessage, getSHA1(privateKey));
private static byte[] getSHA1(String source) throws NoSuchAlgorith,mException, UnsupportedEncodingException{
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] bytes = md.digest(source.getBytes("UTF-8"));
return bytes;
}
private static String getHMACSHA1(String baseString, byte[] keyBytes) throws GeneralSecurityException, UnsupportedEncodingException {
SecretKey secretKey = new SecretKeySpec(keyBytes, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(secretKey);
byte[] bytes = baseString.getBytes("ASCII");
return Hex.encodeHexString(mac.doFinal(bytes));
}
Однако, когда я распечатываю переменную encryptedMessage, она не соответствует части сообщения в сигнатуре примера. В частности, я получаю значение «c8a9188dcf85d1378976729e50f1de5093fabb78» вместо «0f5630424b32402ec03800e977cd7a8b13dbd153».
Обновить
В @ M.Babcock я переписал код C # с данными примера, и он вернул тот же вывод, что и код Java. Так что, похоже, мой подход к хешированию правильный, но я передаю неверные данные (unencryptedMessage). Вздох. Я обновлю этот пост, если / когда смогу определить, какие именно данные необходимо зашифровать - поскольку в «незашифрованном сообщении о проверке», приведенном в документации Recurly, что-то отсутствует.
Обновление 2
Ошибка оказалась в виде данных / формата «незашифрованное сообщение проверки». Сообщение в данных примера на самом деле не зашифровывается до предоставленной подписи примера, так что, возможно, устаревшая документация? В любом случае, я подтвердил, что реализация Java будет работать для реальных данных. Спасибо всем.