Node.js crypto.createSign的Python等效实现及passphrase用法问题
核心问题说明
- 填充模式不匹配:Node.js
crypto.createSign('RSA-SHA256')签名默认使用 PKCS#1 v1.5 填充,你当前Python代码用的PSS填充和Node.js逻辑不一致,这是签名结果不同的核心原因。 - 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
相关产品推荐
相关产品推荐

