rest - 在 RESTful API 方面,使用 RSA 签署 JWT 比 SHA 有什么优势?
问题描述
我有一个后端,它公开了一个 RESTful API,该 API 目前是“对所有人免费”(但使用 https)。
我现在想添加 RBAC(基于角色的访问控制),而 JWT 似乎是可行的方法,我阅读了很多关于 JWT 的内容,但没有看到使用 RSA 而非 SHA 签署令牌的优势。
假设用户已经验证并获得了一个密钥,无论是共享的还是公共/私有的。
现在,在我看来,在这两种情况下——SHA 或 RSA HMAC——双方(客户端和服务器)都必须拥有共享密钥,或者在 RSA 的情况下它们的私钥/公钥的一半。服务器必须根据 JWT 中的声明找到该密钥(在表或数据库中),以验证令牌的签名。一旦它在 JWT 中确认了声称的用户,它将使用配置的角色授权请求。
那么 RSA 在这种情况下有什么优势呢?
解决方案
我假设您在这里谈论的是 RSxxx(例如 RSA256)和 HSxxx(例如 HS256 (HMAC-SHA256))算法。主要区别在于 HS256 是一种对称算法,而 RS256 是一种非对称算法。对称算法只使用一个密钥(或秘密)进行签名和验证,而非对称算法使用私钥进行签名,使用公钥来验证令牌。
如果您共享用于 HS256 的密钥,则知道该密钥的每个人都可以发布或修改并重新签署令牌。如果您与客户共享秘密,那将破坏签名的目的。在 RS256 或任何其他非对称算法的情况下,只有认证服务器知道私钥,任何需要验证令牌的人都可以使用公钥进行验证。匹配的密钥通常由KID
令牌标头中的 (Key Id) 声明标识。
但通常,签名和验证只在服务器端完成,客户端不需要验证令牌,因此根本不需要知道密钥或秘密。因此,您可以在一个简单的服务的情况下,当身份验证和资源服务器相同时,仍然依赖于对称算法。但是,一旦您为多个资源服务器提供了一个单独的身份验证服务器,就应该使用非对称算法。
推荐阅读
- security - 异或加密很容易被黑?
- html - 两个不同 HTML 组件中字体样式的差异
- intellij-idea - IntelliJ IDEA 更新时无法识别的语言环境
- scala - 在余代数上使用 Tagless Final(对象代数)可以吗?
- c# - Swift do-return 有保护条件?
- c# - Get current time in iOS without internet
- python - discord.py:wait_for() 方法的检查参数阻止执行
- azure-devops - 无法在 azure devops 中构建 asp.net 应用程序
- c# - 为什么我无法在控制器中获得发布请求?
- swift - 为什么我的 SynchronizedDictionary 只有在它是结构时才会崩溃?