RS256 vs HS256 有什么不同(JWT签名)?

原文链接 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更有效

### CTF JWT RS256 攻击与防御技巧 #### 攻击方法 在CTF竞赛中,针对JWT(JSON Web Token)RS256算法的攻击主要集中在几个方面: 1. **公钥泄露** 如果服务器使用的公钥被泄露,则可以利用该公钥伪造签名。由于RS256依赖于非对称加密中的私钥进行签名验证,一旦获取到用于验证的公钥,就可以尝试通过暴力破解或其他手段获得对应的私钥[^1]。 2. **混淆无验签模式** 当应用程序配置错误时,可能会允许`none`类型的token绕过鉴权逻辑。尽管这通常不适用于RS256场景下,但如果服务端存在漏洞未能严格校验alg字段,仍有可能受到此类攻击的影响[^2]。 3. **密钥替换攻击** 假设应用同时支持多种签名算法,在某些情况下可以通过修改header部分使 alg 参数变为 HS256 并提供一个已知的秘密作为 HMAC 密钥来创建有效的 token 。然而对于纯RS256实现来说这种可能性较低除非实现了混合模式的支持[^3]。 ```python import jwt # 模拟恶意用户试图更改alg参数并使用HS256代替RS256的情况 malicious_token = jwt.encode({"some": "payload"}, 'secret', algorithm='HS256') print(malicious_token) ``` #### 防御措施 为了有效抵御上述提到的各种潜在威胁,可以从以下几个角度加强安全防护: 1. **保护好私钥/公钥** 私钥应该妥善保管,并且仅限授权人员访问;而公钥则应定期更新发布新版本的同时废除旧版以减少长期暴露风险[^4]。 2. **强制指定签名算法** 应用程序应当明确限定所接受的令牌只能采用特定的一种或几种强安全性较高的算法如ES256, PS256等而不是默认开放所有选项给客户端选择[^5]。 3. **实施严格的输入验证** 对接收到的所有请求都需进行全面细致的数据清洗工作特别是涉及到敏感操作的地方更要谨慎处理防止SQL注入XSS等问题的发生同时也包括对传入Token头部信息的有效性审查确保其未被篡改[^6]。 4. **启用额外的身份认证机制** 结合其他形式的身份确认方式比如双因素或多因子身份验证(MFA),即使发生Token被盗取也能极大程度上保障账户的安全性不受侵害[^7]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值