簡體   English   中英

Java 中的 HMAC-SHA256 產生與 JavaScript 不同的輸出

[英]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.parseBase64 轉換。

你需要讓這些匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM