【问题标题】:How do I decrypt and verify a signature signed with SHA256withRSA standard?如何解密和验证使用 SHA256withRSA 标准签名的签名?
【发布时间】:2018-09-02 01:26:40
【问题描述】:

所以我面临的问题是我正在向服务器发出请求,而服务器正在通过 webhook 响应 -> 此通知可能需要一段时间才能返回。这就是为什么每次收到响应时,我都需要验证响应身份验证头中发送的签名。

他们说他们使用以下方式生成签名: 签名(apikey + nonce + 时间戳 + transactionid)

现在,显然我有 apikey,但我没有时间戳、nonce 和 transactionId 来验证签名是否正确。不明白,那还能解决吗?

无论如何,他们说他们使用 SHA256withRSA (OID: 1.2.840.113549.1.1.11) 标准对其进行签名,因此我必须使用相同的东西来解密它。他们给了我他们的字符串公钥,没有别的(没有证书)。公钥格式为:

-----BEGIN PUBLIC KEY-----
<public key>
-----END PUBLIC KEY-----

我没有在 C# 中找到任何现成的解决方案来解决这个问题,因为我不能只使用 RSA。我可以做些什么来解密他们的签名并验证它真的是他们?

【问题讨论】:

  • SHA 表示安全 Hash 算法。哈希算法并不意味着要以两种方式完成
  • Nonce、transactionid 和时间戳应该在您收到签名的同一响应中
  • 公钥采用 ASN.1 PEM 格式,编码SubjectPublicKeyInfo 结构(也可在 X.509 证书中找到)。它也是默认格式,例如打开ssl。 Bouncy Castle 可以解析它。
  • 如果您的问题只是“我如何读取密钥?” stackoverflow.com/q/41808094/6535399 应该有帮助。

标签: c# cryptography rsa sha256 rsa-sha256


【解决方案1】:

数据应包含您正在寻找的工件。签名不加密数据,而是通常附加(通常附加)到数据。尽管数据未加密(通过签名生成过程),但它当然可以被编码,这意味着您可能必须先对数据进行解码(例如 base 64)。然后签名通过数据的规范二进制表示。

所以一般来说,要验证签名:

  • 解码和聚合数据
  • 解码签名
  • 对数据进行正确的二进制表示
  • 散列二进制表示(通常是签名验证函数的一部分,例如"SHA256withRSA"),最后
  • 验证签名。

除了验证签名之外,您可能还需要执行签名的验证。通常,签名的验证包括以下内容:

  • 验证之前没有使用过随机数(防止重放攻击);
  • 验证时间戳是否在一定范围内。

但如果可能的话,你应该让图书馆来处理这个问题。但是,请检查验证确实发生了,验证检查是否有用并且已执行。

如果使用 PEM(就像您显示的公钥一样),可能是使用 CMS(加密消息语法)隐藏了数据和签名。这是一个二进制容器格式。如果这是真的,那么你肯定需要一个 CMS 库,因为解析消息结构需要大量的知识和实践。

【讨论】:

  • 很高兴为给定协议更具体的任何内容投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2018-05-15
  • 2021-08-10
  • 2016-10-20
  • 1970-01-01
  • 2012-01-16
相关资源
最近更新 更多