Algorithm Confusion Attack
JWT 规范允许 alg: "none" 表示不使用签名。如果服务端没有正确验证算法,攻击者可以:
修改 Payload,将 role 改为 admin,算法改为 none:
// ❌ 有漏洞的验证
function verifyJwt(token) {
const { header, payload } = parseJwt(token)
// 漏洞:根据 header.alg 决定验证方式
if (header.alg === 'none') {
return payload // 直接返回,不验证签名!
}
// 正常验证...
}
// ✅ 安全的验证
function verifyJwt(token) {
const { header, payload } = parseJwt(token)
// 安全:服务端指定算法,忽略 header.alg
if (header.alg !== 'HS256') {
throw new Error('不支持的算法')
}
// 验证签名...
}