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

Node.js crypto.createSign的Python等效实现及passphrase用法问题

核心问题说明

  1. 填充模式不匹配:Node.js crypto.createSign('RSA-SHA256') 签名默认使用 PKCS#1 v1.5 填充,你当前Python代码用的PSS填充和Node.js逻辑不一致,这是签名结果不同的核心原因。
  2. passphrase用法:Node.js中传入的passphrase就是加密PEM私钥的解密口令,对应Python load_pem_private_key方法的password参数,直接传入bytes类型的client_secret即可。

修正后的完整Python代码

import base64
from cryptography.hazmat.primitives import hashes, padding
from cryptography.hazmat.primitives.serialization import load_pem_private_key

def generate_signature(base_string: str, str_private_key: str, client_secret: str = None):
    # 处理私钥密码
    password = client_secret.encode() if client_secret else None
    # 加载私钥
    private_key = load_pem_private_key(
        str_private_key.encode(),
        password=password
    )
    # 签名:使用PKCS#1 v1.5填充 匹配Node.js默认逻辑
    signature = private_key.sign(
        data=base_string.encode(),
        padding=padding.PKCS1v15(),
        algorithm=hashes.SHA256()
    )
    # 输出base64编码结果
    return base64.b64encode(signature).decode()

# 调用示例
if __name__ == "__main__":
    test_str = "abc"
    # 替换为实际私钥和密码,无密码则传None
    private_key_str = "-----BEGIN RSA PRIVATE KEY-----\nxxx\n-----END RSA PRIVATE KEY-----"
    secret = "你的私钥密码"
    print(generate_signature(test_str, private_key_str, secret))

额外注意事项

  • 确保Node.js和Python两边的baseString编码完全一致,避免特殊字符、换行符、空格差异导致签名不一致
  • 私钥格式需要严格匹配,Node.js可直接读取的PEM格式私钥在Python中可以直接使用,不需要额外转换

内容的提问来源于stack exchange,提问作者baklarz2048

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:27:01