为什么你的jwt密钥爆破不出来?
字数 985 2025-08-10 08:28:15

JWT密钥爆破技术详解

1. JWT基础概念

JWT (JSON Web Token) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地传递声明。它由三部分组成,用点号(.)分隔:

  1. Header (头部):包含令牌类型和使用的哈希算法
  2. Payload (负载):包含声明(claims),即用户数据和其他元数据
  3. 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密钥爆破有两种主要方法:

  1. 解密验证法:使用密钥尝试解密JWT,无法解密表示密钥无效
  2. 签名验证法
    • 使用密钥对Header和Payload部分重新生成签名
    • 将生成的签名与原始JWT的第三部分比较
    • 匹配则密钥有效

4. 常见爆破工具

  1. jwttools
  2. myjwt
  3. PyJWT库 (Python实现)
  4. jwt-cracker (Node.js实现)

5. 爆破失败原因分析

5.1 Java jjwt组件特殊处理

当使用Java jjwt框架时,密钥处理流程特殊:

  1. 框架会自动对密钥进行Base64解码
  2. 如果密钥长度不是4的倍数,会从后往前删除字符直到长度为4的倍数

5.2 解决方案

在爆破前需要对密钥进行预处理:

  1. 将密钥长度调整为4的倍数(从后往前删除多余字符)
  2. 然后进行Base64解码
  3. 使用处理后的密钥进行爆破

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. 爆破字典优化建议

  1. 包含常见弱密钥
  2. 包含Base64编码后的常见密钥
  3. 考虑密钥长度调整后的变体
  4. 包含框架默认密钥
  5. 包含应用名称、域名等上下文相关密钥

8. 防御措施

  1. 使用足够复杂和随机的密钥
  2. 定期更换密钥
  3. 限制JWT的有效期
  4. 使用非对称加密算法(如RS256)代替对称加密
  5. 实施密钥轮换机制

9. 总结

JWT密钥爆破是渗透测试中常见的攻击手段,但需要注意不同框架对密钥的特殊处理方式。特别是Java jjwt组件的Base64解码和长度调整机制,是导致爆破失败的重要原因。通过正确的密钥预处理和合适的爆破工具,可以提高爆破成功率。

JWT密钥爆破技术详解 1. JWT基础概念 JWT (JSON Web Token) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地传递声明。它由三部分组成,用点号(.)分隔: Header (头部):包含令牌类型和使用的哈希算法 Payload (负载):包含声明(claims),即用户数据和其他元数据 Signature (签名):用于验证消息在传递过程中没有被篡改 示例JWT格式: 2. JWT结构解析 2.1 Header部分 Base64解码后通常包含: 2.2 Payload部分 Base64解码后包含实际数据: 2.3 Signature部分 由Header和Payload连接后,使用指定算法和密钥生成: 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. 爆破实现代码示例 7. 爆破字典优化建议 包含常见弱密钥 包含Base64编码后的常见密钥 考虑密钥长度调整后的变体 包含框架默认密钥 包含应用名称、域名等上下文相关密钥 8. 防御措施 使用足够复杂和随机的密钥 定期更换密钥 限制JWT的有效期 使用非对称加密算法(如RS256)代替对称加密 实施密钥轮换机制 9. 总结 JWT密钥爆破是渗透测试中常见的攻击手段,但需要注意不同框架对密钥的特殊处理方式。特别是Java jjwt组件的Base64解码和长度调整机制,是导致爆破失败的重要原因。通过正确的密钥预处理和合适的爆破工具,可以提高爆破成功率。