【问题标题】:Sign the token payload using RSA algorithm使用 RSA 算法对令牌有效负载进行签名
【发布时间】:2019-08-24 22:23:45
【问题描述】:

注意: 自签名证书已安装在我的机器上。

我有一个 JWT 令牌,我正在尝试使用 RSA 算法对其进行签名,我找到了一个库“JOSE”,可以通过以下方法实现相同的目的。

Jose.JWT.Encode(payload, certificate.GetRSAPrivateKey(), JwsAlgorithm.RS256);

在深入研究它的“编码”方法后,我发现它使用了Hashing SHA-256算法。

我正在寻找一种方法,其中排除哈希并使用 RSA 直接签名。

任何帮助将不胜感激!

【问题讨论】:

  • 我正在寻找一种排除散列并使用 RSA 直接签名的方法 为什么? RSA 消息签名只有在首先对消息进行哈希处理,然后对哈希进行签名时才有意义。
  • @JamesKPolk 实际上,在消息/令牌太长的情况下,散列是有意义的。在我的情况下,令牌不是那么长,所以我只是想避免这种额外的开销。请提出任何更好的解决方案,以便我可以直接签名。
  • 库旨在实现标准,标准签名算法首先对消息进行哈希处理。散列的成本通常低于签名的成本,因此消除散列步骤并不能为您节省太多。
  • 同意你的观点,但如果我问你直接的解决方案,你能提供吗?
  • RSA 健壮的实现需要固定大小的输入,并且输出经常被填充等等。您要求调整 RSA,所以...您可以推出自己的 RSA 签名实现,但这很可能是错误的(即使谷歌工程师也不这样做)。此外,我正在重申@james 的答案:与 RSA 签名相比,散列确实不会降低性能。

标签: c# cryptography jwt rsa encode


【解决方案1】:

哈希是大多数(如果不是全部)签名算法的安全要求。所以你不能排除它。

但是,您可以使用 RSA 使用签名提供(部分)消息恢复(如 ISO/IEC 9796-2 中所指定),它可以返回(部分)已签名的消息。它们通常被认为已弃用;如果您需要较少的签名开销,那么您可以使用椭圆曲线密码术。

但是,您选择这两个中的哪一个并不重要,因为任何一个都会破坏您尝试实施的 JOSE / JS Web Token 协议。

【讨论】:

  • 简而言之,整个问题:在客户端的情况下,客户端首先必须使用其证书的私钥对有效负载进行签名,然后使用我的证书的公钥对签名的有效负载进行加密。同样,当我使用上述技术从客户端获取令牌时,我将首先使用我的证书的私钥对其进行解密,然后使用客户端的公钥验证签名。因此,在这种方法中没有提到散列(根据我的理解)。能指导一下吗?
猜你喜欢
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2021-08-10
  • 1970-01-01
  • 2022-07-13
  • 2018-07-21
相关资源
最近更新 更多