当前位置: 首页 > 面试题库 >

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

顾宣
2023-03-14
问题内容

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

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

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

')�kb��>�y+������:�o��H�   '

目标是复制以上javascript代码的行为。

您能建议我该怎么做吗?


问题答案:

如果您需要原始字节,则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);
    }
};

当然,请注意字节不会直接转换为字符。 您不能使用文本比较 来与')�kb��>�y+������:�oΚ��H� 'python生成 的内容进行
比较。为此,您 确实
需要一个编码器,例如十六进制或以64为基数。在这种情况下,请改用Artjom的答案。

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

CryptoJS:

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

python:

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

注意html" target="_blank">参数顺序的差异。

两者都产生

0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914


 类似资料:
  • 这看起来很基本,但我没有找到一种方法得到它。当我对一个类做F1时,我在IDE中获得的类文档没有方法摘要。没人觉得有用吗?基本上,我想了解构造函数和方法摘要http://docs.oracle.com/javase/6/docs/api/javax/xml/parsers/saxparser.html。

  • 我一直在尝试获取一个可能的结果列表(与在维基百科中搜索时得到的结果相同)和一个小的文章摘要,通常是第一段。 到目前为止,我能得到的要么是标题列表: https://en.wikipedia.org/w/api.php?action=query 或单个页面的摘要: https://en.wikipedia.org/w/api.php?action=query 是否有可能以类似于此的形式组合这两个查询

  • 我使用iText7和pdfHTML插件将表添加到PDF中。要设置表的可访问性,我想设置表的摘要。我在下面一个找到了同样的问题。但这并没有明确的答案。如何设置表摘要。请指教。 iText7 508表摘要

  • 我知道可以访问docker api,下面的命令运行得很好: 然而,我真的希望避免暴露与容器本身绑定,因为它是CI构建的一部分。是否有其他方法可以从容器本身中检索容器图像id/哈希(即),而不暴露并向它发出请求? 也许就像这里显示的Docker一样,如何从容器中获取容器信息?

  • 问题内容: 使AngularJS与其他JavaScript-MVC框架区分开的一件事是,它能够使用绑定将JavaScript中的绑定值回传到HTML。当您为$ scope变量分配任何值时,Angular会“自动”执行此操作。 但是,这有多自动化?有时,Angular不会接受更改,因此我需要调用$ scope。$ apply()或$ scope。$ digest()来通知angular来获取更改。有

  • 实验概要 这一章的实验指导中,你将会学到: 单独生成 ELF 格式的用户程序,并打包进文件系统中 创建并运行用户进程 使用系统调用为用户程序提供服务