安全扫描交上来一个 token,头部 alg 写的是 HS256,拿线上公开的 RSA 公钥当密钥算 HMAC,服务端接收后返回 200,还带着用户资料一起回来。日志里能对上时间点,这种反而好排。
解析库按 token 头里声明的 alg 去挑算法,服务端没有锁定允许值,走到 HS256 分支就把公钥当成对称密钥用,而公钥本来就能从接口直接拿到。这一点先确认清楚,后面就不用反复试。
# 先看 token 头声明了什么算法 cut -d. -f1 token.txt | base64 -d 2>/dev/null # 校验端写死允许的算法 JWT_ALLOWED_ALG=RS256
「JWT 算法混淆」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。
处理上按这个顺序:校验的时候固定住算法家族,只认 RS256 这一种取值方式;服务端显式拒绝 none 和任何空 alg 的 token,别给默认值留下口子;公钥不要放在能随便下载的静态目录里,能被替换就白做。
结果对不对很好判断,伪造算法头的 token 会被直接拒绝,正常的 RS256 token 依旧能通过校验并返回用户信息。
