Elixir与Python生成的RSA签名不匹配,如何实现一致?
解决RSA签名Python与Elixir代码不匹配问题
你当前的Python和Elixir RSA签名结果不一致,核心是Elixir代码存在3处关键逻辑错误,对应修正如下:
核心错误分析
- 哈希处理逻辑错误:Python直接对
key_id + timestamp的字节序列计算SHA512哈希后签名;而你的Elixir代码把哈希结果转成了小写十六进制字符串,相当于对哈希的字符串表示签名,而非原始哈希值。 - 签名算法指定错误:Python使用SHA512哈希的PKCS#1 v1.5签名,Elixir里却指定
:sha(对应SHA1),算法不匹配。 - 私钥解析错误:手动截取26字节的操作完全错误,Python的
RSA.import_key可直接解析Base64解码后的标准RSA私钥,Elixir无需手动截断,直接解析即可。
修正后的Elixir代码
defmodule RsaExample do defp api_key() do Application.get_env(:rsa_example, :api_key) end defp key_id() do Application.get_env(:rsa_example, :key_id) end def get_signature do dt = "2024-12-19T08:48:29.528457+00:00" message = key_id() <> dt # 直接对消息字节计算SHA512哈希,与Python逻辑一致 hash = :crypto.hash(:sha512, message) # 解析Base64解码后的私钥,无需手动截断 private_key = api_key() |> Base.decode64!() |> :public_key.der_decode(:RSAPrivateKey) # 使用SHA512的PKCS#1 v1.5签名,对应Python的pkcs1_15 signature = :public_key.sign(hash, :sha512, private_key) |> Base.encode64() {:ok, %{ keyId: key_id(), timestamp: dt, signature: signature }} end end
验证说明
修正后,Elixir代码的逻辑与Python完全对齐:
- 生成相同的待签名消息字符串
- 对消息字节计算SHA512原始哈希值
- 使用相同的PKCS#1 v1.5签名算法(Elixir的
:public_key.sign/3指定:sha512时,默认使用PKCS#1 v1.5填充,与Python的pkcs1_15一致) - 正确解析私钥,无手动截断错误
运行修正后的代码,生成的签名会与Python代码输出完全一致。
内容的提问来源于stack exchange,提问作者Marsel.V
相关产品推荐
相关产品推荐

