用Javascript生成HMAC与用python带有utf-8编码字符生成的HMAC不匹配

问题描述

python服务器生成hmac:

dict_payload = {"name": "Emulsión"}
payload = jsonpickle.encode(dict_payload,unpicklable=False)
python_hmac = hmac.new("secret",bytes(payload,"utf-8"),hashlib.sha256,)

returns - 29c7e4b7049a61c24d0f57c402510d6b0c42b15e97981d6ce96b02fdcf913a45

和节点js:

payload = {"name": "Emulsión"}
crypto
    .createHmac("sha256","secret")
    .update(payload,"utf8")
    .digest("hex");

returns - 61d834992df9a302d8ca1768d4d04be644ba1c35054b342db3ed29f4b2f1e888

似乎在python中,ó字符已由\u00f3替换 如何在Javascript中实现相同功能?

解决方法

您需要确保正确处理输入中的引号。

payload = {"name": "Emulsión"}
str(payload)

给你:

"{'name': 'Emulsión'}"

这与带有双引号的json字符串不同:

'{"name": "Emulsión"}'

,将导致不同的结果。如果您确保您的字符串完全相同相同,则会得到相同的结果:

import hmac 
import hashlib

payload = '{"name": "Emulsión"}'
    
python_hmac = hmac.new(b"secret",bytes(payload,"utf-8"),hashlib.sha256,)

python_hmac.hexdigest()

# '61d834992df9a302d8ca1768d4d04be644ba1c35054b342db3ed29f4b2f1e888'

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...