从 javascript 参考案例中复制 python 中的 hmac 操作

Reproducing an hmac operation in python from the javascript reference case

我有一个 javascript 的片段可以正常运行:

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 fe6a57f08b9970b7cd497e627afac956203a8ef829d2d97c7967775c1c0b6f6a

我尝试在 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 01703d8db07432ca416151099533b60baea7a6450fc5b88788c7ca9af921b4a1

但结果不正确

我认为我缺少的步骤是 javascript 中发生的 CryptoJS.enc.Hex.parse(seed) 操作。我不明白这对种子价值有何影响。我尝试 console.log() 该值,但它 returns 是一个我不理解的复杂对象。

所以我的问题是:

  1. 那个函数对 seed
  2. 做了什么
  3. 如何在 python 中执行等效操作。

这些算法适用于原始字节。您的种子以十六进制表示这些字节,即 31 是一个字节,9a 是另一个字节。 CryptoJS.enc.Hex.parse 将十六进制解析为字节。 Python 中的等价物是 codecs.decode("...", "hex").

盐看起来也像十六进制,但您的 JS 不会这样解析它,所以我在 python 中也将其视为 UTF8。

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