RS256与HS256有什么区别?

1,663 阅读5分钟

在学习JWTs时,你经常听到的一些术语是签名和签署。如果教程是创建JWT,你可能会看到他们选择一种算法来创建签名。但什么是签名算法,它们是如何工作的?进一步阅读,了解JWT签名算法和两种最常用的算法。

当你创建JSON网络令牌时,它们会被签名。签署令牌允许其接收者验证令牌的内容没有改变,并验证令牌创建签名的原始发行者。

**注意了!**签名不是加密!

签署JWTs并不能使其数据不可读。签名只允许验证JWT的内容没有被改变。

签名是JWT的一部分,用于验证JWT的内容自发布之时起没有改变(例如,在中间人攻击中会发生)。

RS256和HS256是用于签署JWT的最常用的算法。本文将介绍RS256和HS256的一些区别。这篇文章将不涉及其他JWT签名算法,如ES256或PS256。

要查看更多签署算法,请查看列出所有签署算法的规范。

什么是JWT签名?

签名是通过结合JWT的有效载荷的编码版本来创建的,将它们和秘密作为参数传入头中定义的算法。

下面是一个可用于创建JWT签名的示例代码。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

下面是一个签名后的JWT外观的输出示例。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

每个部分(头、有效载荷和签名)都由一个句号(.)隔开。

下图强调了通过jwt.io解码的JWT的签名部分。

jwt.io

JWT通常使用两种算法之一进行签名:HS256(HMAC使用SHA256)和RS256(RSA使用SHA256)。

这就给你留下了一个问题。

RS256和HS256签名算法之间有什么区别?

HS256 签名算法

HS256(使用SHA-256的HMAC)是一种对称密钥的散列算法,使用一个秘密密钥。对称意味着两方共享秘密密钥。该密钥用于生成签名和验证签名。

在使用共享密钥时要注意;如果验证器(多个应用程序)没有适当的安全性,它可能会打开潜在的漏洞。

这个stackexchange问题上阅读更多关于有密钥的哈希值与签名的内容。

RS256 签名算法

RS256(RSA签名与SHA-256)是一种非对称算法,使用公共/私人密钥对。身份提供者有一个私钥来生成签名。JWT的接收者使用一个公钥来验证JWT签名。用于验证的公钥和用于签署令牌的私钥是相通的,因为它们是作为一对生成的。请看这篇博文,了解公钥加密法的介绍

**注意:**在这两种情况下,第三方有可能找到你的秘钥并生成一个被认为对你的应用有效的JWT。令牌的验证者(应用程序)拥有签署JWT的相同密钥,这增加了暴露给第三方的风险。你需要采取谨慎措施来保护密钥不被泄露,如将秘密放在安全的秘密存储中,限制对秘密的访问等。

免费试用最强大的认证平台。开始吧→

RS256或HS256?你应该使用哪个?

虽然HS256和RS256都可以用来验证JWT的完整性,但目前推荐的算法是RS256。

签名必须确保真实性,这意味着JWT的内容与发送者生成的内容相同。HS256和RS256算法都能确保JWT的真实性。

RS256还能确保不可抵赖性,这意味着它能保证发件人生成了签名。

使用RS256,你可以确定只有私钥的持有者而没有其他人可以签署令牌。此外,如果秘钥被破坏,你可以轮换签名密钥,而不用像HS256那样用新的秘钥重新部署你的应用程序。

请记住,即使钥匙没有被泄露,定期轮换钥匙也是好的。轮换钥匙可以减少泄露的机会。例如,如果你超过365天没有轮换你的钥匙,Auth0会通知你。

你可能想知道是否有任何情况下你会选择HS256?很好的问题!是的,有几种情况下你可以使用HS256。

在处理不能支持RS256的传统应用时,您可以考虑使用HS256。使用HS256而不是RS256的另一个可能的用例是,当您的应用程序发出非常多的请求时,因为HS256比RS256更有效率。

总结

在这篇文章中,你学到了JWTs的HS256和RS256签名算法的一些关键区别,具体如下。

  • HS256是一种对称算法,在身份提供者和你的应用程序之间共享一个秘密密钥。同一密钥用于签署JWT并允许验证该签名。

  • RS256算法是一种非对称算法,使用私钥来签署JWT,使用公钥来验证该签名。

  • 在签署你的JWT时,RS256是推荐的算法。它更安全,而且如果钥匙被破坏,你可以快速地旋转钥匙。(Auth0默认使用RS256来签署JWT)。

你可以通过阅读Auth0的文档了解更多关于签名密钥的工作方式


© 2013-2022 Auth0公司。保留所有权利。