如何将以下 CryptoJS 代码转换为 Python?

How to convert the following CryptoJS code into Python?

使用以下 javascript 代码时:

var username = "TEST";
var password = "test";
var key = "6591bbcb28880da7e7b91154ec39a9d5";
var latin_parsed = CryptoJS.enc.Latin1.parse(password + username);
var message = CryptoJS.SHA1(latin_parsed);
var key_hex = CryptoJS.enc.Hex.parse(key);
var hash_password = CryptoJS.HmacSHA1(message, key_hex)
var hash_password_hex = hash_password.toString(CryptoJS.enc.Hex);

// Above code gives this output:
// hash_password_hex == "2f0dc5257278493636a30fe5d3eeda43f4d8d8c1"

可以在这里看到一个活生生的例子:https://jsfiddle.net/Ld7469vh/

我尝试使用以下 Python 代码,但哈希值不相似。

https://gist.github.com/heskyji/5167567b64cb92a910a3

但是散列不相似。看起来像 CryptoJS returns WordsArray 而不是字符串。 所以我的问题可能取决于这种差异,但我不确定如何在 python.

中创建 1:1 解决方案

Python 使用 bytes 进行大多数 encryption/byte 相关操作。使用 bytes.hexbytes.fromhex.

完成十六进制和反十六进制的转换

您可以在有关 hashlib and hmac 的文档中阅读更多内容。它们都遵循相同的通用格式,即创建对象(并可选择使用数据更新它,或立即执行,如下所示)并获取它的摘要。

# these are both built in
import hashlib
import hmac

username = "TEST"
password = "test"
string_key = "6591bbcb28880da7e7b91154ec39a9d5"

latin_parsed = (password + username).encode('utf-8')  # this is now `bytes`
message = hashlib.sha1(latin_parsed).digest()  # sha1 of latin_parsed
key = bytes.fromhex(string_key)  # turn it into `bytes` as well

hash_password = hmac.HMAC(key, message, hashlib.sha1).digest()  # do hmac of this with key key and message message
hash_password_hex = hash_password.hex()

print(hash_password_hex)
# 2f0dc5257278493636a30fe5d3eeda43f4d8d8c1

链接的代码使用 signature2 = base64.urlsafe_b64encode(signature1) 而不是十六进制字符串。它也不会做你想要的 - 它应该首先组合用户名和密码(警告,长度扩展攻击)并在将其输入 hmac 之前先对其进行哈希处理。