jwt签名:RS256或HS256

时间:2017-08-25 09:27:01

标签: jwt digital-signature signature

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

  

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

     

HS256是一种对称算法,这意味着只有一个密钥,在双方之间共享。使用相同的密钥来生成签名并对其进行验证。应特别注意钥匙是否保密。

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

2 个答案:

答案 0 :(得分:4)

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

  • 感知方便
  • 易于理解并开始使用if new 到Oauth2 / OIDC(与感知方便有关)
  • 表现(?)

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

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

效果 - 是的,这里HS256可能有一个利基市场。除了缓存公共证书等(对于使用node.js的缓存示例,请参阅herehere),拥有对称密钥并在应用程序本地使用该密钥而无需任何网络请求等,证明更有效率。也就是说,大多数优秀的JWKS库/ sdks都会处理开箱即用的缓存选项。

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

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

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

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

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

答案 1 :(得分:0)

就我而言,使用对称算法的优点是创建一个只有服务器知道如何读取它的令牌。对称算法是最好的,因为它很快并产生很小的结果。