为什么你的jwt密钥爆破不出来?
字数 985 2025-08-10 08:28:15
JWT密钥爆破技术详解
1. JWT基础概念
JWT (JSON Web Token) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地传递声明。它由三部分组成,用点号(.)分隔:
- Header (头部):包含令牌类型和使用的哈希算法
- Payload (负载):包含声明(claims),即用户数据和其他元数据
- Signature (签名):用于验证消息在传递过程中没有被篡改
示例JWT格式:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
2. JWT结构解析
2.1 Header部分
Base64解码后通常包含:
{
"alg": "HS256", // 签名算法
"typ": "JWT" // 令牌类型
}
2.2 Payload部分
Base64解码后包含实际数据:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
2.3 Signature部分
由Header和Payload连接后,使用指定算法和密钥生成:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
3. JWT密钥爆破原理
JWT密钥爆破有两种主要方法:
- 解密验证法:使用密钥尝试解密JWT,无法解密表示密钥无效
- 签名验证法:
- 使用密钥对Header和Payload部分重新生成签名
- 将生成的签名与原始JWT的第三部分比较
- 匹配则密钥有效
4. 常见爆破工具
- jwttools
- myjwt
- PyJWT库 (Python实现)
- jwt-cracker (Node.js实现)
5. 爆破失败原因分析
5.1 Java jjwt组件特殊处理
当使用Java jjwt框架时,密钥处理流程特殊:
- 框架会自动对密钥进行Base64解码
- 如果密钥长度不是4的倍数,会从后往前删除字符直到长度为4的倍数
5.2 解决方案
在爆破前需要对密钥进行预处理:
- 将密钥长度调整为4的倍数(从后往前删除多余字符)
- 然后进行Base64解码
- 使用处理后的密钥进行爆破
6. 爆破实现代码示例
import jwt
import base64
# 密钥处理函数
def process_key(key):
# 调整密钥长度为4的倍数
adjusted_key = key[:len(key)-(len(key)%4)]
# Base64解码
return base64.b64decode(adjusted_key)
# JWT解密函数
def jwt_decrypt(jwt_str, secret_key):
try:
# 尝试使用HS256算法解密
decoded = jwt.decode(jwt_str, secret_key, algorithms=["HS256"])
return True, decoded
except:
try:
# 尝试使用HS512算法解密
decoded = jwt.decode(jwt_str, secret_key, algorithms=["HS512"])
return True, decoded
except:
return False, None
# 示例使用
jwt_token = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.VFb0qJ1LRg_4ujbZoRMXnVkUgiuKq5KxWqNdbKq_G9Vvz-S1zZa9LPxtHWKa64zDl2ofkT8F6jBt_K4riU-fPg"
test_key = "wadsadac"
# 处理密钥
processed_key = process_key(test_key)
# 尝试解密
success, result = jwt_decrypt(jwt_token, processed_key)
if success:
print("爆破成功!解密结果:", result)
else:
print("密钥无效")
7. 爆破字典优化建议
- 包含常见弱密钥
- 包含Base64编码后的常见密钥
- 考虑密钥长度调整后的变体
- 包含框架默认密钥
- 包含应用名称、域名等上下文相关密钥
8. 防御措施
- 使用足够复杂和随机的密钥
- 定期更换密钥
- 限制JWT的有效期
- 使用非对称加密算法(如RS256)代替对称加密
- 实施密钥轮换机制
9. 总结
JWT密钥爆破是渗透测试中常见的攻击手段,但需要注意不同框架对密钥的特殊处理方式。特别是Java jjwt组件的Base64解码和长度调整机制,是导致爆破失败的重要原因。通过正确的密钥预处理和合适的爆破工具,可以提高爆破成功率。