如何将以下 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.hex
和 bytes.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 之前先对其进行哈希处理。
使用以下 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.hex
和 bytes.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 之前先对其进行哈希处理。