Cómo obtener una representación de resumen de CryptoJS.HmacSHA256 en JS

Tengo que generar la representación de cadena de CryptoJS.HmacSHA256 en resumen (representación de bytes).

Lo necesito porque tengo que duplicar el código de Python que genera dicho resumen en javascript:

 print hmac.new("secret", "test", hashlib.sha256).digest() ') kb  > y+      : oΚ  H  ' 

El objective es duplicar el comportamiento del código anterior en javascript.

¿Podría por favor sugerirme cómo hacer esto?

Si necesita bytes sin procesar, CryptoJS no parece proporcionar código para ello. Se menciona que esto se debe a la falta de compatibilidad entre navegadores para Uint8Array y sus amigos.

Sin embargo, después de buscar, encontré un código de conversión creado por 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); } }; 

Tenga en cuenta que los bytes no se traducen directamente en caracteres; no se puede usar una comparación de texto para comparar con ') kb > y+ : oΚ H ' generado por python. Para eso necesitas un codificador como hexadecimales o base 64. En ese caso, por favor mira la respuesta de Artjom .

No puedes simplemente enviar bytes a JavaScript. Necesita convertir esto en una representación textual para que sea comparable. La encoding hexadecimal es compatible con el módulo hmac de Python y CryptoJS.

CryptoJS:

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

Pitón:

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

Note la diferencia en el orden del argumento.

Ambos producen

 0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914