javascript - 使用 python 重新创建 CryptoJS Hmac

标签 javascript python cryptography hmac cryptojs

场景是,我有一个 JS 脚本,它为用户提供的输入创建 HMAC,并且我想使用 python 为相同的输入计算相同的 HMAC。为了让事情更清楚,请考虑以下 JS 和 Python 代码片段。

Javascript

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac-sha256.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/enc-base64.min.js"></script>

<script>
    var secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w=";
    var stringtoSign = "Test";

    // Generate HMAC SHA256 signature
    var secretAccessKeyBase64 = CryptoJS.enc.Base64.parse(secretAccessKey);
    var hash = CryptoJS.HmacSHA256(stringtoSign, secretAccessKeyBase64);
    var signature = CryptoJS.enc.Base64.stringify(hash);
</script>

Python

stringToSign = "Test"
secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w="

secretAccessKeyBase64 = base64.b64decode(secretAccessKey).hex()
keyBytes = bytes(secretAccessKeyBase64, 'utf-8')
stringToSignBytes = bytes(stringToSign, 'utf-8')
signatureHash = hmac.new(keyBytes, stringToSignBytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(signatureHash)
print(signature)

Javascript代码给我b+1wRzDODA85vyDZkXByPIKO5qmnjCRNF5gZFi33/Ic=,而Python给我值b'SsZ4bcYe3op1nGU6bySzlSc9kgg9Kgp37qzF15s2zNc='

为什么我的 python 代码为提供给 JS 脚本的(看似)相同的输入生成不同的 HMAC?有没有办法使用python获取JS代码输出的HMAC值?

最佳答案

您在 Javascript 中使用 Base64 编码值作为 secret ,而在 Python 中您使用纯文 native 密。

<script>
    var secretAccessKeyBase64 = "secret";
    var hash = CryptoJS.HmacSHA256("Message", secretAccessKeyBase64);
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
    document.write(hashInBase64);
</script>

这会打印出与 Python 代码相同的值:

qnR8UCqJggD55PohusaBNviGoOJ67HC6Btry4qXLVZc=

编辑:

base64 返回一个字节对象,无需将其转换为 hex():

stringToSign = "Test"
secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w="

secretAccessKeyBase64 = base64.b64decode(secretAccessKey)
keyBytes = secretAccessKeyBase64
stringToSignBytes = bytes(stringToSign, 'utf-8')

signatureHash = hmac.new(keyBytes, stringToSignBytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(signatureHash)
print(signature)

正确打印:

b'b+1wRzDODA85vyDZkXByPIKO5qmnjCRNF5gZFi33/Ic='

关于javascript - 使用 python 重新创建 CryptoJS Hmac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54317579/

相关文章:

javascript - onclick 启动打开弹出窗口的 javascript - 不确定函数调用

javascript - 比较javascript中的时间戳

python - 如何获取xarray中最大值的坐标?

amazon-web-services - 保护为 AWS EC2 生成的私钥

android - 了解谷歌开发者控制台

javascript - 根据数据元素当前拥有的类来更改数据元素的样式?

javascript - 谷歌地图 API : How can I turn a `place_id` into geocoordinates?

python - 用excel/sql/pandas中同一列中出现的频率替换列中的值

python - 为什么 Python 允许您从函数内部将局部变量实例化为全局变量?

java - 在 AEAD GCM 模式下篡改 AES 加密缓冲区时,不会引发 AEADBadTagException