JWT签名: RS256或HS256

5
在Auth0中,有两种JWT令牌签名算法:RS256和HS256。
RS256是一种非对称算法,这意味着有两个密钥:一个公钥和一个私钥(秘密)。Auth0拥有秘密密钥,用于生成签名,而JWT的使用者拥有公共密钥,用于验证签名。
HS256是一种对称算法,这意味着有两个参与方之间只有一个秘密密钥。同一个密钥既用于生成签名,也用于验证签名。为保持密钥机密性需要特别小心。
在他们的文档中,他们描述了使用RS256的优点。能否有人解释下使用HS256算法的优点?我现在看不出来,但我相信一定存在某些优点。

1
可能是RS256 vs HS256: What's the difference?的重复问题。 - cassiomolin
@Vitalii - 请看我的回答 - 我是否已经为您解答了问题?有什么不清楚的吗? - arcseldon
1个回答

8
您要求了HS256相对于RS256的优势,例如:
  • 感知方便性
  • 如果是新手使用Oauth2 / OIDC,则易于理解和入门(与感知方便性有关)
  • 性能(?)
让我们快速看一下每个方面: 感知方便性/理解该怎么做- 确实,将clientId和clientSecret复制到应用程序的配置中既易于理解又快速完成。然而,今天的库也使得RS256设置变得简单 - 库/框架通常会提供检索公钥并使用类似HS256的配置进行验证但不需要提供密钥的功能。如果不熟悉,请查看一些Auth0示例以了解如何使用您的技术选择。

性能 - 是的,这里HS256有潜在的优势。不考虑缓存公共证书等内容(例如使用node.js进行缓存的例子请参见此处此处),仅在应用程序本地使用对称密钥而无需任何网络请求可能更加高效。尽管如此,大多数良好的JWKS库/SDK将处理缓存选项。

但实际上,您应该问自己的问题是,这些好处(性能优化?)是否超过了劣势 - 特别是从安全的角度来看。

请查看答案,如果仍未被说服,请在那里留下评论(Auth0社区网站)。 Auth0已经默认使用RS256用于新客户端,并且其资源API也默认使用RS256。

RS256的一个主要优点是,它胜过选择HS256的大多数论点,因为根本没有必要将密钥与客户端应用程序存储(共存) - 私钥仅由授权服务器(Auth0等)知道,密钥不会泄漏。这就几乎告诉你为什么在大多数情况下RS256是更好的选择。
机密性与公共客户端 - 只有当您的客户端被视为机密客户端时,您才应该考虑HS256。由于机密客户端能够持有密钥,您可以选择向它们发出已通过两种方式签名的ID令牌 - 对于非机密客户端,您不应该使用HS256,因为根据定义,客户端无法保持秘密机密。
还有其他考虑因素使HS256成为较差的选择,例如如果签名密钥轮换,则需要手动更新使用给定客户端配置的所有应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接