[英]HMAC-SHA256 in Java produces different output than JavaScript
我一直在嘗試將一些 NodeJS 代碼移植到 Java,以便向 API 發出 HMAC 簽名的請求。 我已經能夠將代碼簡化到編碼明顯影響輸出的程度。
這是我的 JavaScript 代碼:
var APIKey = "secret"; var secretByteArray = CryptoJS.enc.Base64.parse(APIKey); var hash = CryptoJS.HmacSHA256("Message", secretByteArray); var hashInBase64 = CryptoJS.enc.Base64.stringify(hash); //alert(hashInBase64); document.write(hashInBase64);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/enc-base64.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac-sha256.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
這是Java代碼:
try {
String secret = "secret";
String message = "Message";
byte[] secretByteArray = Base64.getEncoder().encode(secret.getBytes());
//byte[] secretByteArray = Base64.encodeBase64(secret.getBytes("utf-8"), true);
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secretByteArray, "HmacSHA256");
sha256_HMAC.init(secret_key);
String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
}
catch (Exception e){
System.out.println("Error");
}
如果我不將“秘密”編碼為 base64,我會得到相同的輸出,但我希望使用編碼字符串獲得相同的結果。 我懷疑編碼的字節數組有填充或符號差異。
您的 Java 代碼使用Base64.getEncoder().encode
轉換為Base64。
您的 JavaScript 代碼使用CryptoJS.enc.Base64.parse
從Base64 轉換。
你需要讓這些匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.