Tengo un fragmento de javascript que funciona correctamente:
let seed = '319aa8124bbcddac2bae8438cfd5e658aeca56d524736739622dfb0a09942b22'; let salt = '0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526'; // 1. HMAC_SHA256(message=seed, key=salt) const hmac = CryptoJS.HmacSHA256(CryptoJS.enc.Hex.parse(seed), salt); let foo = hmac.toString(CryptoJS.enc.Hex); console.log("foo", hmac.toString(CryptoJS.enc.Hex)); //foo fe6a57f08b9970b7cd497e627afac956203a8ef829d2d97c7967775c1c0b6f6aIntento reproducirlo en python:
seed = "319aa8124bbcddac2bae8438cfd5e658aeca56d524736739622dfb0a09942b22" salt = "0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526" hm = hmac.new(str.encode(seed), b'', hashlib.sha256) hm.update(salt.encode("utf-8")) h = hm.hexdigest() print(h) # returns 01703d8db07432ca416151099533b60baea7a6450fc5b88788c7ca9af921b4a1pero el resultado es incorrecto.
Creo que el paso que me falta es la CryptoJS.enc.Hex.parse(seed) que ocurre en javascript. No entiendo qué está haciendo eso con el valor inicial. Intento console.log() ese valor pero devuelve un objeto complicado que no entiendo.
Entonces mis preguntas son:
seedEstos algoritmos funcionan en bytes sin procesar. Su semilla representa esos bytes en hexadecimal, es decir, 31 es un byte, 9a es otro. CryptoJS.enc.Hex.parse analiza el hexadecimal en bytes. El equivalente en Python es con codecs.decode("...", "hex") .
La sal también parece hexadecimal, pero su JS no la analiza como tal, así que también la he tratado como UTF8 en Python.
import hmac import hashlib import codecs seed = codecs.decode(b"319aa8124bbcddac2bae8438cfd5e658aeca56d524736739622dfb0a09942b22", "hex") salt = u"0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526".encode("utf8") hm = hmac.new(salt, seed, hashlib.sha256) h = hm.hexdigest() print(h) # returns fe6a57f08b9970b7cd497e627afac956203a8ef829d2d97c7967775c1c0b6f6a