javascript 如何在 JS 中获取 CryptoJS.HmacSHA256 的摘要表示
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29432506/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get digest representation of CryptoJS.HmacSHA256 in JS
提问by Andriy Ivaneyko
I have to generate string representation of CryptoJS.HmacSHA256
in digest (bytes representation).
我必须生成CryptoJS.HmacSHA256
摘要中的字符串表示(字节表示)。
I need it because i have to duplicate python code which generate such digest in javascript:
我需要它,因为我必须复制在 javascript 中生成此类摘要的 python 代码:
print hmac.new("secret", "test", hashlib.sha256).digest()
')?kb??>?y+??????:?oΚ??H? '
The goal is to duplicate behaviour of code above in javascript.
目标是在 javascript 中复制上面代码的行为。
Could you please suggest me how to do this?
你能建议我怎么做吗?
采纳答案by Maarten Bodewes
If you need raw bytes then CryptoJS does not seem to supply code for it. It is mentioned that this is because of lack of cross browser compatibility for Uint8Array
and friends.
如果您需要原始字节,那么 CryptoJS 似乎不会为其提供代码。提到这是因为Uint8Array
和朋友们缺乏跨浏览器的兼容性。
However, after searching, I did find some conversion code created by Vincenzo Ciancia:
但是,经过搜索,我确实找到了 Vincenzo Ciancia 创建的一些转换代码:
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);
}
};
Note of course that bytes don't translate directly to characters; you cannot use a text compareto compare against ')?kb??>?y+??????:?oΚ??H? '
generated by python. For that you doneed an encoder such as hexadecimals or base 64. In that case please look at the answer from Artjominstead.
当然请注意,字节不会直接转换为字符;您不能使用文本比较来比较')?kb??>?y+??????:?oΚ??H? '
由 python 生成的。为此,您确实需要一个编码器,例如十六进制或基数 64。在这种情况下,请查看Artjom的答案。
回答by Artjom B.
You can't simply send bytes to JavaScript. You need to convert this to a textual representation for it to be comparable. Hex encoding is supported by both python's hmac module and CryptoJS.
您不能简单地向 JavaScript 发送字节。您需要将其转换为文本表示以使其具有可比性。python 的 hmac 模块和 CryptoJS 都支持十六进制编码。
CryptoJS:
加密JS:
CryptoJS.HmacSHA256("test", "secret").toString(CryptoJS.enc.Hex)
Python:
Python:
hmac.new("secret", "test", hashlib.sha256).hexdigest()
Note the difference in the argument ordering.
请注意参数顺序的差异。
Both produce
两者都产生
0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914