从 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 是一个我不理解的复杂对象。
所以我的问题是:
- 那个函数对
seed
做了什么
- 如何在 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
我有一个 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 是一个我不理解的复杂对象。
所以我的问题是:
- 那个函数对
seed
做了什么
- 如何在 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