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

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完全对齐:

  1. 生成相同的待签名消息字符串
  2. 对消息字节计算SHA512原始哈希值
  3. 使用相同的PKCS#1 v1.5签名算法(Elixir的:public_key.sign/3指定:sha512时,默认使用PKCS#1 v1.5填充,与Python的pkcs1_15一致)
  4. 正确解析私钥,无手动截断错误

运行修正后的代码,生成的签名会与Python代码输出完全一致。

内容的提问来源于stack exchange,提问作者Marsel.V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:40:54