首页 > 解决方案 > 在 RESTful API 方面,使用 RSA 签署 JWT 比 SHA 有什么优势?

问题描述

我有一个后端,它公开了一个 RESTful API,该 API 目前是“对所有人免费”(但使用 https)。

我现在想添加 RBAC(基于角色的访问控制),而 JWT 似乎是可行的方法,我阅读了很多关于 JWT 的内容,但没有看到使用 RSA 而非 SHA 签署令牌的优势。

假设用户已经验证并获得了一个密钥,无论是共享的还是公共/私有的。

现在,在我看来,在这两种情况下——SHA 或 RSA HMAC——双方(客户端和服务器)都必须拥有共享密钥,或者在 RSA 的情况下它们的私钥/公钥的一半。服务器必须根据 JWT 中的声明找到该密钥(在表或数据库中),以验证令牌的签名。一旦它在 JWT 中确认了声称的用户,它将使用配置的角色授权请求。

那么 RSA 在这种情况下有什么优势呢?

标签: restjwtrsahmacsha

解决方案


我假设您在这里谈论的是 RSxxx(例如 RSA256)和 HSxxx(例如 HS256 (HMAC-SHA256))算法。主要区别在于 HS256 是一种对称算法,而 RS256 是一种非对称算法。对称算法只使用一个密钥(或秘密)进行签名和验证,而非对称算法使用私钥进行签名,使用公钥来验证令牌。

如果您共享用于 HS256 的密钥,则知道该密钥的每个人都可以发布或修改并重新签署令牌。如果您与客户共享秘密,那将破坏签名的目的。在 RS256 或任何其他非对称算法的情况下,只有认证服务器知道私钥,任何需要验证令牌的人都可以使用公钥进行验证。匹配的密钥通常由KID令牌标头中的 (Key Id) 声明标识。

但通常,签名和验证只在服务器端完成,客户端不需要验证令牌,因此根本不需要知道密钥或秘密。因此,您可以在一个简单的服务的情况下,当身份验证和资源服务器相同时,仍然依赖于对称算法。但是,一旦您为多个资源服务器提供了一个单独的身份验证服务器,就应该使用非对称算法。


推荐阅读