You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:30:50