如何在 JS 中获取 CryptoJS.HmacSHA256 的摘要表示
How to get digest representation of CryptoJS.HmacSHA256 in JS
我必须在摘要(字节表示)中生成 CryptoJS.HmacSHA256
的字符串表示。
我需要它,因为我必须复制在 javascript 中生成此类摘要的 python 代码:
print hmac.new("secret", "test", hashlib.sha256).digest()
')�kb��>�y+������:�o��H� '
目标是在 javascript.
中复制上述代码的行为
你能建议我怎么做吗?
您不能简单地将字节发送到 JavaScript。您需要将其转换为文本表示以使其具有可比性。 python 的 hmac 模块和 CryptoJS 都支持十六进制编码。
加密JS:
CryptoJS.HmacSHA256("test", "secret").toString(CryptoJS.enc.Hex)
Python2:
hmac.new("secret", "test", hashlib.sha256).hexdigest()
Python3:
hmac.new("secret".encode("utf-8"), "test".encode("utf-8"), hashlib.sha256).hexdigest()
注意参数顺序的不同。
全部生产
0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914
如果您需要原始字节,那么 CryptoJS 似乎没有为其提供代码。提到这是因为 Uint8Array
和朋友缺乏跨浏览器兼容性。
不过,经过搜索,我确实找到了一些由 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);
}
};
当然请注意,字节不会直接转换为字符; 您不能使用文本比较 与 python 生成的 ')�kb��>�y+������:�oΚ��H� '
进行比较。为此,您 do 需要一个编码器,例如十六进制或 base 64。在这种情况下,请改为查看 。
我必须在摘要(字节表示)中生成 CryptoJS.HmacSHA256
的字符串表示。
我需要它,因为我必须复制在 javascript 中生成此类摘要的 python 代码:
print hmac.new("secret", "test", hashlib.sha256).digest()
')�kb��>�y+������:�o��H� '
目标是在 javascript.
中复制上述代码的行为你能建议我怎么做吗?
您不能简单地将字节发送到 JavaScript。您需要将其转换为文本表示以使其具有可比性。 python 的 hmac 模块和 CryptoJS 都支持十六进制编码。
加密JS:
CryptoJS.HmacSHA256("test", "secret").toString(CryptoJS.enc.Hex)
Python2:
hmac.new("secret", "test", hashlib.sha256).hexdigest()
Python3:
hmac.new("secret".encode("utf-8"), "test".encode("utf-8"), hashlib.sha256).hexdigest()
注意参数顺序的不同。
全部生产
0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914
如果您需要原始字节,那么 CryptoJS 似乎没有为其提供代码。提到这是因为 Uint8Array
和朋友缺乏跨浏览器兼容性。
不过,经过搜索,我确实找到了一些由 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);
}
};
当然请注意,字节不会直接转换为字符; 您不能使用文本比较 与 python 生成的 ')�kb��>�y+������:�oΚ��H� '
进行比较。为此,您 do 需要一个编码器,例如十六进制或 base 64。在这种情况下,请改为查看