第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python 與 JavaScript 中的 HMAC SHA256

Python 與 JavaScript 中的 HMAC SHA256

喵喵時(shí)光機(jī) 2023-02-07 11:02:41
我想用JavaScript重新實(shí)現(xiàn)某個(gè)用Python編寫的API客戶端。我無(wú)法復(fù)制 HMAC SHA256 簽名功能。對(duì)于某些鍵,輸出是相同的,但對(duì)于某些鍵,輸出是不同的。在解碼其 Base64 表示后,當(dāng)密鑰由可打印字符組成時(shí),輸出似乎是相同的。Python#!/usr/bin/env python3import base64import hashlibimport hmacdef sign_string(key_b64, to_sign):    key = base64.b64decode(key_b64)    signed_hmac_sha256 = hmac.HMAC(key, to_sign.encode(), hashlib.sha256)    digest = signed_hmac_sha256.digest()    return base64.b64encode(digest).decode()print(sign_string('VGhpcyBpcyBhIHByaW50YWJsZSBzdHJpbmcuCg==', "my message"))print(sign_string('dGhlIHdpbmQgb2YgTXQuIEZ1amkK', "my message"))print(sign_string('pkmNNJw3alrpIBi5t5Pxuym00M211oN86IhLZVT8', "my message"))JavaScript<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.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/enc-base64.min.js"></script><script>    function sign_string(key_b64, to_sign) {        key = atob(key_b64)        var hash = CryptoJS.HmacSHA256(to_sign, key);        var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);        document.write(hashInBase64 + '<br>');    }    sign_string('VGhpcyBpcyBhIHByaW50YWJsZSBzdHJpbmcuCg==', "my message")    sign_string('dGhlIHdpbmQgb2YgTXQuIEZ1amkK', "my message")    sign_string('pkmNNJw3alrpIBi5t5Pxuym00M211oN86IhLZVT8', "my message")</script>產(chǎn)出PythonTdhfUQfym16HyWQ8wxQeNVvJKr/tp5rLKHYQSpURLpw=pQ5NzK3KIWjqc75AXBvWgLK8X0kZvjRHXrLAdxIN+Bk=8srAvMucCd91CWI7DeCFjxJrEYllaaH63wmVlMk0W+I=JavaScriptTdhfUQfym16HyWQ8wxQeNVvJKr/tp5rLKHYQSpURLpw=pQ5NzK3KIWjqc75AXBvWgLK8X0kZvjRHXrLAdxIN+Bk=31QxOpifnpFUpx/sn336ZmmjkYbLlNrs8NP9om6nPeY=如您所見(jiàn),前兩個(gè)是相同的,而最后一個(gè)是不同的。如何更改 JavaScript 代碼以使其行為與 python 代碼相同?
查看完整描述

1 回答

?
互換的青春

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

您嘗試提供給 CryptoJs 的 base64 編碼秘密并不代表 CryptoJS 需要的有效 UTF-8 字符串。您可以使用此工具檢查有效性。atob()編碼不可知,只是逐字節(jié)轉(zhuǎn)換,不檢查它是否是有效的 UTF-8。


在這里,我用 CryptoJS 自己的解碼器對(duì) base64 密碼進(jìn)行了解碼,它拋出了一個(gè)錯(cuò)誤,說(shuō)它是無(wú)效的 UTF-8:


<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.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/enc-base64.min.js"></script>


<script>

    function sign_string(key_b64, to_sign) {

        var key = CryptoJS.enc.Base64.parse(key_b64).toString(CryptoJS.enc.Utf8);

        var hash = CryptoJS.HmacSHA256(to_sign, key);

        var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);

        document.write(hashInBase64 + '<br>');

    }

    sign_string('VGhpcyBpcyBhIHByaW50YWJsZSBzdHJpbmcuCg==', "my message")

    sign_string('dGhlIHdpbmQgb2YgTXQuIEZ1amkK', "my message")

    sign_string('pkmNNJw3alrpIBi5t5Pxuym00M211oN86IhLZVT8', "my message")

</script>

我還找到了一種可以使用原始字節(jié)作為密鑰的方法。這適用于最后一個(gè)鍵,但不適用于前兩個(gè)鍵。


var key = CryptoJS.enc.Hex.parse(toHex(atob(key_b64)));

現(xiàn)在,如果您將這兩種方法結(jié)合起來(lái),您就可以獲得真正的解決方案。這個(gè)最終代碼給出了與 python 相同的輸出:


<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.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/enc-base64.min.js"></script>


<script>

    function sign_string(key_b64, to_sign) {

        try {

            var key = CryptoJS.enc.Base64.parse(key_b64).toString(CryptoJS.enc.Utf8);

        }

        catch {

            var key = CryptoJS.enc.Hex.parse(toHex(atob(key_b64)));

        }

        var hash = CryptoJS.HmacSHA256(to_sign, key);

        var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);

        document.write(hashInBase64 + '<br>');

    }

    

    function toHex(str) {

        var result = '';

        for (var i=0; i<str.length; i++) {

          if (str.charCodeAt(i).toString(16).length === 1) {

            result += '0' + str.charCodeAt(i).toString(16);

          } else {

            result += str.charCodeAt(i).toString(16);

          }

        }

        return result;

    }


    sign_string('VGhpcyBpcyBhIHByaW50YWJsZSBzdHJpbmcuCg==', "my message")

    sign_string('dGhlIHdpbmQgb2YgTXQuIEZ1amkK', "my message")

    sign_string('pkmNNJw3alrpIBi5t5Pxuym00M211oN86IhLZVT8', "my message")

    sign_string('xTsHZGfWUmnIpSu+TaVraECU88O3j9qVjlwTWGb/C8k=', "my message")

</script>


查看完整回答
反對(duì) 回復(fù) 2023-02-07
  • 1 回答
  • 0 關(guān)注
  • 356 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)