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

How to get digest representation of CryptoJS.HmacSHA256 in JS

本文关键字:HmacSHA256 表示 CryptoJS JS      更新时间:2023-09-26

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

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

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 2:

hmac.new("secret", "test", hashlib.sha256).hexdigest()

Python 3:

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� '进行比较。为此,确实需要一个编码器,如十六进制或64进制。在这种情况下,请看Artjom的答案。