ダイジェストでCryptoJS.HmacSHA256
の文字列表現を生成する必要があります(バイト表現)。
Javascriptでそのようなダイジェストを生成するpythonコードを複製する必要があるため、私はそれが必要です:
print hmac.new("secret", "test", hashlib.sha256).digest()
')�kb��>�y+������:�o��H� '
目標は、上記のコードの動作をjavascriptで複製することです。
これを行う方法を教えていただけますか?
生のバイトが必要な場合、CryptoJSはそのためのコードを提供していないようです。これは、Uint8Array
とその友人のブラウザ間の互換性がないためであると言われています。
しかし、検索した後、VincenzoCianciaによって作成された変換コードを見つけました。
CryptoJS.enc.u8array = {
/**
* Converts a Word array to a Uint8Array.
*
* @param {WordArray} wordArray The Word array.
*
* @return {Uint8Array} The Uint8Array.
*
* @static
*
* @example
*
* var u8arr = CryptoJS.enc.u8array.stringify(wordArray);
*/
stringify: function (wordArray) {
// Shortcuts
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
// Convert
var u8 = new Uint8Array(sigBytes);
for (var i = 0; i < sigBytes; i++) {
var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
u8[i]=byte;
}
return u8;
},
/**
* Converts a Uint8Array to a Word array.
*
* @param {string} u8Str The Uint8Array.
*
* @return {WordArray} The Word array.
*
* @static
*
* @example
*
* var wordArray = CryptoJS.enc.u8array.parse(u8arr);
*/
parse: function (u8arr) {
// Shortcut
var len = u8arr.length;
// Convert
var words = [];
for (var i = 0; i < len; i++) {
words[i >>> 2] |= (u8arr[i] & 0xff) << (24 - (i % 4) * 8);
}
return CryptoJS.lib.WordArray.create(words, len);
}
};
もちろん、バイトは文字に直接変換されないことに注意してください。 テキストcompareを使用して、Pythonによって生成された')�kb��>�y+������:�oΚ��H� '
と比較することはできません。そのためには、doに16進数やbase 64などのエンコーダーが必要です。その場合は、代わりに Artjomからの回答 を参照してください。 。
単純にバイトをJavaScriptに送信することはできません。比較できるようにするには、これをテキスト表現に変換する必要があります。 16進エンコーディングは、PythonのhmacモジュールとCryptoJSの両方でサポートされています。
CryptoJS:
CryptoJS.HmacSHA256("test", "secret").toString(CryptoJS.enc.Hex)
Python:
hmac.new("secret", "test", hashlib.sha256).hexdigest()
引数の順序の違いに注意してください。
両方とも
0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914