1214 字
6 分钟
JWT

一.什么是 jwt#

jwt 是一种用来身份认证与授权的令牌格式,jwt 包括 jws 和 jwe,每个 token 包含 headers,payload,signature,头表明加密使用的算法是什么,payload 保存传输的内容,签名用来验证,jws 整个部分都使用 base64url 编码但并不加密,jwe 加密,一般使用 jws,签名部分用来校验内容是否遭到篡改,签名的生成:

Signature = HMACSHA256( base64UrlEncode(header) + ”.” + base64UrlEncode(payload), secret-key )

在 bp 的插件中添加密钥时需要使用 base64 编码格式

header 中可选参数:

jwk:将公钥的 jason 格式直接嵌入头部

jku:提供一个 url,从 url 中拿到公钥

kid:表示使用的密钥存储在服务器的 id

二.常见攻击方式#

1.未正确验证签名,服务器端使用解码而非验证,导致使用任意密钥均能通过

2.无签名,接受 none 的签名

3.弱密码,密钥泄露或可爆破

3.参数注入攻击:

jwk:若服务器未验证签证来源是否可靠,则可嵌入任意 jwk 来绕过验证

jwu:同上

kid 遍历攻击:服务器将文件内容作为密钥,后端直接拼接/keys/kid.pem 来获取密钥,若为严格过滤可能导致目录遍历

其他参数:cty,x5c

4.算法混淆

服务端在验证签名时使用 jwt 中的 alg ,若修改 alg 为对称加密,则服务器会使用公钥来进行签名,而不是私钥,这样信息就会泄露和篡改,服务器端应该使用硬编码的 alg,不信任客户端传输的头

对称加密与非对称加密#

1.服务端与客户端二者通信,为防止消息泄露二者采用密钥对信息进行加密,但是服务端需要先向客户端发送密钥,这样客户端才能对信息进行加解密,但是在传输钥匙的过程中钥匙也可能被中间人截取,导致加密失败

2.采用双密钥加密的方式,使用两把钥匙 A,B,用 A 加密的东西只能用 B 来解密,反过来也一样,服务端在开始传递密钥 B 给客户端,密钥 B 依旧可能会被中间人截取,服务端再用 A 加密信息后传递给客户端,中间人可以利用截取到的钥匙 B 来解密内容,但是却无法篡改,因为用 A 加密的只能用 B 来进行解密,如果中间人篡改信息,客户端收到信息后用 B 解密不出来说明信息遭到了篡改,这样就防范了中间人进行信息篡改,但依旧会导致信息泄露

3.采用四把钥匙进行加解密,两两之间可以互相加解密,有钥匙 A,B,C,D,服务端先向客户端传递钥匙 B,中间人也可以趁机拿到 B, 客户端拿到后用 B 加密传递钥匙 D,自己则有钥匙 C,因为 B 加密的只有 A 可以解密,所以这次传递 D 的时候中间人不能拿到钥匙 D,之后只要服务端与客户端用 C,D 来加解密信息中间人就不能查看或篡改内容了

4.采用单双钥匙进行加解密,使用四把🔑每次加解密都要用不同的钥匙,降低了效率,服务端先准备 C,D 两把钥匙,先将 D 传递给客户端,同样中间人此时能获取钥匙 D,客户端收到后用 D 加密,把钥匙 M 放进去传给服务端,此时中间人不能查看也不能获取信息,M 安全的传送到服务端,服务端拿到钥匙 M 后就可以用 M 进行加解密,客户端同样也可以用 M 进行加解密,因为钥匙 M 并没有泄露,这样除了第一次之后每次都只用同一把钥匙 M 进行加解密也提升了效率

但是中间人可以在第一次传输的时候将钥匙 D 换成自己的钥匙 X,同时自己还配一把钥匙 Y,客户端拿到 X 后用 X 来加密传输 M,但是中间人就可以利用自己的 Y 来解密获取钥匙 M

5.使用受信任的第三方机构,第三方拥有公钥 K 和私钥 J,在传送钥匙 D 的时候先传给第三方用公钥 K 进行加密,这是第三放可以用 K 来解密内容但是却无法篡改钥匙 M,因为用 K 加密的需要用 J 来解密

对称加密:加密解密使用同一密钥

非对称加密:使用不同密钥

JWT
https://lab404.cn/posts/jwt/
作者
见山
发布于
2025-11-18
许可协议
CC BY-NC-SA 4.0