Python Crypto HMAC签名生成逻辑转JavaScript的问题排查与解决
Python签名生成逻辑转JavaScript的匹配问题解决
原Python签名逻辑
我需要把以下Python函数中的签名生成逻辑转换为JavaScript代码,核心聚焦签名生成环节:
def prepare_url(self, segments, params={}): if self.token is not None: sig = hmac.new(self.token.key.encode(), digestmod=hashlib.sha1) sig.update(self.method.lower().encode()) sig.update(self.service.lower().encode()) ts = self.get_timestamp(self.token.server_offset) sig.update(ts.encode()) params["timestamp"] = ts sig.update(self.token.identifier.lower().encode()) params["signature-method"] = "auth" params["signature-version"] = self.version params["signature"] = base64.standard_b64encode(sig.digest()) self.url = "%s/%s/%d/" % (self.base_path, self.service, self.version) self.url += "/".join([urllib.parse.quote(s) for s in segments]) if params: self.url += "?%s" % urllib.parse.urlencode(params)
初始JavaScript错误实现
我使用Node.js的crypto库编写了如下代码:
import crypto from 'crypto'; const KEY = '5d016f32-452f-4b9b-8e81-641e14d4d98c'; const METHOD = 'get'; const SERVICE = 'data'; const date = (new Date()).toISOString().slice(0, 19); const encoded = crypto.createHash('sha1') .update(KEY) .update(METHOD.toLowerCase()) .update(SERVICE.toLowerCase()) .update(date) .digest('hex'); console.log(encoded); const baseEncoded = btoa(encoded); console.log(baseEncoded);
问题现象
两种方式生成的签名无法匹配:
- Python生成的签名:
b'oV4RJ6pAz+hxZsxeQthx8gZrhAY=' - JavaScript生成的签名:
YTZjMmIyYjQzOGEwZGUxZTU1YTNjMWVlYjA3MTA3NTFmODc0MDM3ZQ==
正确JavaScript实现
排查后得到正确的实现代码:
const encoded = crypto.createHmac('sha1', key) .update(METHOD.toLowerCase()) .update(SERVICE.toLowerCase()) .update(date) .update(identify) .digest('base64');
内容的提问来源于stack exchange,提问作者Peter Pallen
相关产品推荐
相关产品推荐

