Как получить дайджест-представление CryptoJS.HmacSHA256 в JS
Я должен сгенерировать строковое представление CryptoJS.HmacSHA256
в дайджесте (байтовое представление).
Мне это нужно, потому что я должен дублировать код python, который генерирует такой дайджест в javascript:
print hmac.new("secret", "test", hashlib.sha256).digest()
')�kb��>�y+������:�o��H� '
Цель состоит в том, чтобы дублировать поведение кода выше в javascript.
Не могли бы вы, пожалуйста, предложите мне, как это сделать?
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