Как получить дайджест-представление CryptoJS.HmacSHA256 в JS


Я должен сгенерировать строковое представление CryptoJS.HmacSHA256 в дайджесте (байтовое представление).

Мне это нужно, потому что я должен дублировать код python, который генерирует такой дайджест в javascript:

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

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

Цель состоит в том, чтобы дублировать поведение кода выше в javascript.

Не могли бы вы, пожалуйста, предложите мне, как это сделать?

2 6

2 ответа:

Если вам нужны необработанные байты, то CryptoJS, похоже, не предоставляет код для этого. Отмечается, что это происходит из-за отсутствия кроссбраузерной совместимости для Uint8Array и друзей.

Однако, после поиска, я нашел некоторый код преобразования, созданный Винченцо Чианчиа:

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. Вам нужно преобразовать это в текстовое представление, чтобы оно было сопоставимым. Шестнадцатеричное кодирование поддерживается как модулем HMAC python, так и CryptoJS.

CryptoJS:

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

Python:

hmac.new("secret", "test", hashlib.sha256).hexdigest()
Обратите внимание на разницу в порядке следования аргументов.

Оба производят

0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914