Я должен написать клиентский код Ruby на Java. В коде используется секретный ключ и кодировка Base64 для формирования значения hmac. Я попытался написать аналогичный код на Java, но приведенное значение hmac не совпадает с результатом Ruby-скрипта. Пожалуйста, найдите приведенный ниже код кода для Java & Ruby вместе с приведенным результатом.
Код Java:
public static void main(String[] args)
throws NoSuchAlgorithmException, InvalidKeyException
{
// get an hmac_sha1 key from the raw key bytes
String secretKey =
"Ye2oSnu1NjzJar1z2aaL68Zj+64FsRM1kj7I0mK3WJc2HsRRcGviXZ6B4W+/V2wFcu78r8ZkT8=";
byte[] secretkeyByte = Base64.decodeBase64(secretKey.getBytes());
SecretKeySpec signingKey = new SecretKeySpec(secretkeyByte, "HmacSHA1");
// get an hmac_sha1 Mac instance and initialize with the signing key.
String movingFact = "0";
byte[] text = movingFact.getBytes();
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
// compute the hmac on input data bytes
byte[] rawHmac = mac.doFinal(text);
byte[] hash = Base64.encodeBase64(rawHmac);
System.out.println("hash :" + hash);
}
Выход Java: хэш: [B @72a32604
Рубиновый код:
def get_signature()
key = Base64.decode64("Ye2oSnu1NjzJar1z2aaL68Zj+64FsRM1kj7I0mK3WJc2HsRRcGviXZ6B4W+/V2wFcu78r8ZkT8=")
digest = OpenSSL::Digest::Digest.new('sha1')
string_to_sign = "0"
hash = Base64.encode64(OpenSSL::HMAC.digest(digest, key, string_to_sign))
puts "hash: " + hash
end
Ruby Output: hash: Nxe7tOBsbxLpsrqUJjncrPFI50E =
Как упоминалось в комментариях, вы печатаете описание своего массива байтов, а не содержимое:
Заменить:
System.out.println("hash :" + hash);
С:
System.out.println("hash: " + new String(hash, StandardCharsets.UTF_8));
byte[]
не являетсяString
! Попробуйте вместо этого напечататьnew String(hash, StandardCharsets.UTF_8)
. Кроме того, вы должны указать кодировку, когда вы.getBytes()
дляString
.