【问题标题】:jwt signature: RS256 or HS256jwt 签名:RS256 或 HS256
【发布时间】:2018-02-03 07:49:26
【问题描述】:

在 Auth0 中有两种 jwt 令牌签名算法:RS256 和 HS256。

RS256 是一种非对称算法,这意味着有两个密钥:一个公共密钥和一个私有(秘密)密钥。 Auth0有秘钥,用来生成签名,JWT的消费者有公钥,用来验证签名。

HS256 是一种对称算法,这意味着只有一个密钥,由双方共享。相同的密钥用于生成签名和验证它。应特别注意密钥的保密性。

在他们的文档中,他们描述了RS256 的优势。有人可以解释一下使用HS256 算法的优势吗,我现在看不到它们,但我很确定有一些。

【问题讨论】:

标签: jwt digital-signature signature


【解决方案1】:

您已要求 HS256 优于 RS256,例如。

  • 感知到的便利
  • 如果是新的,易于理解并开始使用 到 Oauth2 / OIDC(与感知便利相关)
  • 性能 (?)

让我们快速浏览一下这些:

感知到的便利/了解该做什么 - 确实,将 clientId 和 clientSecret 复制到应用程序的配置中既容易理解,又可以快速完成。然而,今天的库使 RS256 的设置也很简单——库/框架通常会提供检索公钥的功能,并使用与 HS256 类似的配置进行验证,但无需提供秘密。如果不熟悉,请查看一些使用您的技术选择的 Auth0 示例以了解这一点。

性能 - 是的,HS256 可能在这方面占有一席之地。除了缓存公共证书等(有关使用 node.js 的缓存示例,请参阅 herehere),拥有对称密钥并在应用程序本地使用它,根本不需要任何网络请求等,可能会更有效。也就是说,大多数优秀的 JWKS 库/sdks 将处理开箱即用的缓存选项。

但实际上,您应该问的问题是这些好处(性能优化?)是否超过了缺点 - 当然从安全角度来看。

请参阅此answer,如果仍然不相信,请随时将 cmets 留在那里(Auth0 社区网站)。 Auth0 已切换到默认为新客户端使用 RS256,其资源 API 也默认为 RS256。

RS256 的一个主要优势(胜过选择 HS256 的大多数论点)就是无需与客户端应用程序存储(共同定位)秘密 - 私钥仅由授权服务器(Auth0 等)知道),秘密不能泄露。仅此一项就足以告诉您为什么 RS256 在大多数情况下绝对是更好的选择。

机密客户与公共客户 - 如果您的客户被视为 Confidential Client,您甚至应该考虑 HS256。由于机密客户端能够保存机密,因此您可以选择向他们颁发已以两种方式之一签名的 ID 令牌 - 对于非机密客户端,您永远不应该使用 HS256,因为根据定义客户端无法使用保守秘密。

还有其他一些考虑因素也使 HS256 成为较差的选择,例如,如果存在签名密钥翻转,则需要使用给定的客户端配置手动更新所有应用程序。

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 2021-03-02
    • 2018-11-25
    • 2020-09-25
    • 2017-06-20
    • 2018-08-26
    • 2021-05-29
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多