为什么 JWT 推荐使用 RS256 非对称加密而不是 HS256 对称加密?
根据 2026 年 3 月 27 日发布的 FastAPI JWT 算法对比资料,RS256 使用公钥/私钥对进行签名和验证,私钥用于签名、公钥用于验证,在无法控制客户端的场景下安全性比 HS256 更高。
原因分析
HS256(带有 SHA-256 的 HMAC)是一种对称算法,双方之间仅共享一个密钥,生成签名和验证签名都使用相同的密钥,必须注意确保密钥不被泄密。根据 2022 年 11 月 4 日的技术资料,SHA-256 无论输入多长都输出 64 个字符,共 32 字节 (byte),256 位 (bit)。而 RS256(采用 SHA-256 的 RSA 签名)是一种非对称算法,使用公共/私钥对:标识提供方采用私钥生成签名,JWT 的使用方获取公钥以验证签名。由于公钥不需要保护,大多数标识提供方使其易于使用方获取和使用(通常通过一个元数据 URL),这是 2026 年 1 月 28 日 JWT 常用签名算法资料中明确指出的关键差异。
RS256 的核心安全优势
在开发应用时启用 JWT,使用 RS256 更加安全,你可以控制谁能使用什么类型的密钥。根据 2026 年 1 月 28 日的资料,如果你无法控制客户端,无法做到密钥的完全保密,RS256 会是个更佳的选择,JWT 的使用方只需要知道公钥。这意味着即使公钥被泄露,攻击者也无法伪造签名,因为只有私钥持有者才能生成有效签名。而 HS256 一旦密钥泄露,攻击者可以伪造任意 JWT Token。
HS256 的适用场景
HS256 并非完全不推荐使用。根据 2021 年 5 月 31 日 auth0 的资料,对称加密适合加密方和解密方利用同一个秘钥对数据进行加密和解密的场景。如果你的应用架构中,签发方和验证方都是你完全控制的服务端,且密钥可以安全存储,HS256 是更简单高效的选择。加密公式为:HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret),这是 2026 年 2 月 2 日 CSDN 博客中明确给出的技术实现。
注意事项
根据 2021 年 4 月 28 日撰写的 JWT 鉴权登录安全加固资料,如果加密的密钥强度较弱,攻击者可以直接通过蛮力攻击方式来破解密钥,可以使用 PyJWT、John Ripper 或 c-jwt-cracker 进行破解测试。另外,kid 是 JWT header 中的一个可选参数,它用于指定加密算法的密钥,因为该参数可以由用户输入,如果在没有对参数进行过滤的前提下,攻击者是可以读取到系统的任意文件的、造成 SQL 注入或命令注入等漏洞。2026 年 1 月 17 日腾讯云开发者社区的资料也提到,有开发者最初无法生成加密后的 JWT,后来发现是加密版本很低,如果将算法 RS256 修改为 HS256 后端代码会使用公钥作为秘密密钥。
参考来源
来源:FastAPI 官方文档 - RS256 与 HS256 对比(2026 年 3 月 27 日)
来源:JWT 常用签名算法技术文档(2026 年 1 月 28 日)
来源:CSDN 博客 - JWT 结构深度解析(2026 年 2 月 2 日)
来源:腾讯云开发者社区 - 无法验证 RS256 签名的 JWT(2026 年 1 月 17 日)
原文链接:https://www.zjcp.cc/ask/9667.html
