据我所知,HMAC是一种对称签名算法(单密钥),RSA是一种非对称签名算法(私钥/公钥对)。我试图在这两种方法之间进行选择,以便对JSON令牌进行签名。
但是,我对HMAC的用例有点困惑。如果客户端(用户)和服务器共享一个密钥,那么是什么阻止客户端更改令牌的有效负载字段(可能是主题为另一个用户的id),然后退出令牌客户端。很明显这会很糟糕。HMAC是否只保证数据是由拥有秘密密钥的人签名的,而不仅仅是一个实体,就像RSA那样?这到底有什么用例,也许我误解了什么?或者,秘密密钥甚至根本不与客户共享?
发布于 2019-10-25 05:50:12
HMAC用于防止无法访问秘密的人进行操纵。通常,这意味着如果只有服务器知道秘密,则防止客户端进行操作;或者,如果客户端和服务器知道秘密,则防止在传输过程中进行操作。
基于RSA的签名用于防止操作,还允许其他人在不操作数据的情况下验证数据的完整性和来源。这是可以做到的,因为只有数据的提供者和签名者才知道私钥,而每个喜欢验证完整性的人都知道公钥。
因此,选择什么取决于您的特定用例。如果服务器只需要保护令牌不受客户端的操纵,那么使用带有服务器端机密的HMAC就足够了。相反,如果还需要向其他人证明令牌是由特定(受信任的)服务器创建的,那么应该使用基于RSA的签名。
https://security.stackexchange.com/questions/220185
复制相似问题