Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在JS中获取CryptoJS.HmacSHA256的摘要表示_Javascript_Python_Cryptography_Hmac_Cryptojs - Fatal编程技术网

Javascript 如何在JS中获取CryptoJS.HmacSHA256的摘要表示

Javascript 如何在JS中获取CryptoJS.HmacSHA256的摘要表示,javascript,python,cryptography,hmac,cryptojs,Javascript,Python,Cryptography,Hmac,Cryptojs,我必须在摘要(字节表示)中生成CryptoJS.HmacSHA256的字符串表示 我需要它,因为我必须复制python代码,这些代码在javascript中生成这样的摘要: print hmac.new("secret", "test", hashlib.sha256).digest() ')�kb��>�y+������:�oΚ��H� ' 目标是在javascript中复制上述代码的行为 你能告诉我怎么做吗?你不能简单地将字节发送到JavaScript。您需要将其转换为文本表示

我必须在摘要(字节表示)中生成
CryptoJS.HmacSHA256
的字符串表示

我需要它,因为我必须复制python代码,这些代码在javascript中生成这样的摘要:

print hmac.new("secret", "test", hashlib.sha256).digest()

')�kb��>�y+������:�o��H�   '
目标是在javascript中复制上述代码的行为


你能告诉我怎么做吗?

你不能简单地将字节发送到JavaScript。您需要将其转换为文本表示,以使其具有可比性。python的hmac模块和CryptoJS都支持十六进制编码

CryptoJS:

CryptoJS.HmacSHA256("test", "secret").toString(CryptoJS.enc.Hex)
Python:

hmac.new("secret", "test", hashlib.sha256).hexdigest()
请注意参数顺序上的差异

两者都产生

0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914

如果您需要原始字节,那么CryptoJS似乎没有为其提供代码。提到这是因为
Uint8Array
和朋友之间缺乏跨浏览器兼容性

但是,在搜索之后,我确实找到了Vincenzo Cincia创建的一些转换代码:

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);
    }
};
CryptoJS.enc.u8array={
/**
*将字数组转换为Uint8Array。
*
*@param{WordArray}WordArray字数组。
*
*@return{Uint8Array}返回Uint8Array。
*
*@静态
*
*@example
*
*var u8arr=CryptoJS.enc.u8array.stringify(wordArray);
*/
stringify:函数(wordArray){
//捷径
var words=wordArray.words;
var sigBytes=wordArray.sigBytes;
//皈依
var u8=新的Uint8Array(单位为sigBytes);
对于(变量i=0;i>>2]>>(24-(i%4)*8))&0xff;
u8[i]=字节;
}
返回u8;
},
/**
*将UINT8数组转换为字数组。
*
*@param{string}u8Str返回Uint8Array。
*
*@return{WordArray}字数组。
*
*@静态
*
*@example
*
*var wordArray=CryptoJS.enc.u8array.parse(u8arr);
*/
解析:函数(u8arr){
//捷径
var len=u8arr.length;
//皈依
var-words=[];
对于(变量i=0;i单词[i>>>2]|=(u8arr[i]&0xff)�y+������:�oΚ��H�   '由python生成。为此,您确实需要一个编码器,如十六进制或base 64。在这种情况下,请改为查看。

我不确定您在这里试图实现什么。您需要的确切输出格式是什么?仅32字节?请注意,比较HMAC值可能会导致基于时间的侧通道攻击,具体取决于使用的协议。注意:我没有测试上面的代码。有几个人似乎对它很满意。不过我建议围绕它编写一些测试。我还没有找到代码的原始源代码,所以我使用了一个链接到你的帖子。你能提供一个吗?有趣的是,如果你使用Shopify的液体hmac_sha256字符串过滤器,它是一个lso输出十六进制值。对于Python,您无法将字符串传递给
hmac.new()
方法。如果我传递字符串,我将收到此错误:
TypeError:key:预期的字节或字节数组,但得到了'str'
@SlickSlime是的,此答案是为Python 2编写的。您必须首先对(Unicode)字符串进行编码