原文链接 RS256 vs HS256 What's the difference? | Auth0
JWT 签名
当您创建JSON Web令牌时,它们会被签名。对令牌进行签名允许其接收方验证令牌的内容未被更改,并验证已创建签名的令牌的原始发行者。
Heads up! 签名不是加密。
JWT 通常使用两种算法之一进行签名:HS256 (HMAC使用SHA256)和RS256 (RSA使用SHA256)。
HS256 签名算法
HS256 (HMAC with SHA-256) 是一种使用一个密钥的对称密钥散列算法。对称意味着双方共享密钥。密钥用于生成签名和验证签名。
【HMAC 全程是 Hash-based Message Authentication Code】
使用共享密钥时要小心;如果验证器【verifiers】(多个应用程序)没有得到适当的保护,它可能会打开潜在的漏洞。
RS256 签名算法
RS256 (RSA Signature with SHA-256)是一种使用公私钥对的非对称算法。身份提供程序具有用于生成签名的私钥。JWT的接收方使用公钥来验证JWT签名。用于验证的公钥和用于签名令牌的私钥是链接的,因为它们是成对生成的。查看这篇博客文章,Public-Key Cryptography了解公钥密码学的介绍。
RS256 or HS256? 该用哪一个?
虽然HS256和RS256都可以用来验证 JWT 的完整性,但此时推荐的算法是RS256。
签名必须确保真实性,这意味着JWT内容与发送方生成的内容相同。HS256和RS256算法都保证了JWT的真实性。
RS256还确保不可否认性(non-repudiation),这意味着它保证发送方已经生成了签名。
使用RS256,您可以确定只有私钥的持有者才能签署令牌,其他人无法签署令牌。此外,如果密钥被泄露,您可以轮换签名密钥,而无需使用新密钥重新部署应用程序,就像使用HS256一样。
记住,即使钥匙没有被损坏,定期轮换钥匙也是好的。旋转密钥(rotating keys)可以减少被攻击的机会。例如,如果你超过365天没有轮换密钥,Auth0就会通知你。
你可能想知道是否有任何情况下你会选择HS256?好问题!是的,在一些情况下你可以使用HS256。
在处理不支持RS256的遗留应用程序时,您可以考虑使用HS256。使用HS256而不是RS256的另一个可能的用例是当您的应用程序发出大量请求时,因为HS256比RS256更有效。