挖洞中怎样判断数据的加密方式?看看这几个技巧
原创
是老A
是老A
老A搞安全
2026年8月12日 07:54
贵州
在小说阅读器读本章
去阅读
一位深耕网络安全的老兵,目前是一家安全公司的技术分管,擅长渗透测试及安全培训方向,老A的愿望是大家没烦恼,一切顺心!
测试时,看到一串乱码参数,不知道是AES、Base64还是MD5,亦或是自定义编码,OMG!整个人麻完
内心:领导,这系统实在干不动了,我都不知道这串数据是啥!
把账户/密码打乱,丢到面前都不知道解密……
再讲干货前,先搞懂,编码、加密、哈希是怎么一回事
很多人一看到“乱码”就说是“加密”,其实大多数情况可能是编码
| 类型 | 特点 | 例子 |
| 编码 | 可逆,无密钥,谁都能解 | Base64、Hex |
| 加密 | 可逆,需要密钥 | AES、DES |
| 哈希 | 不可逆,固定长度 | MD5、SHA1、SHA256 |
遇到一个看起来像“密文”的参数,第一步是判断它属于哪一类
第一个技巧:看长度和字符集
这是最快的方式,眼睛扫一下就行
Base64的特征:
字符集:A-Z、a-z、0-9、+、/、=长度:永远是4的倍数末尾经常带=
示例:eyJ1c2VyX2lkIjoxMjN9
Hex(十六进制)的特征:
字符集:只有0-9和a-f长度:永远是偶数
示例:7a8f3b2c1d4e5f6a
MD5的特征:
固定长度:32位字符集:只有0-9和a-f
示例:5d41402abc4b2a76b9719d911017c592
SHA1的特征:
固定长度:40位字符集:只有0-9和a-f
SHA256的特征:
固定长度:64位字符集:只有0-9和a-f
AES(Hex格式)的特征:
长度:16的倍数(16、32、48、64……)字符集:只有0-9和a-f
示例:7a8f3b2c1d4e5f6a7b8c9d0e1f2a3b4c
RSA的特征:
长度取决于密钥长度1024位密钥 → Base64后约172个字符2048位密钥 → Base64后约344个字符
第二个技巧:看参数名
参数名本身会告诉你很多信息,不需要去分析密文
| 参数名 | 大概率是什么 |
| token、access\_token | JWT |
| sign、signature | MD5/SHA/HMAC签名 |
| password | 可能是MD5/SHA,也可能是明文 |
| data、params、encryptData | AES等对称加密 |
| callback、jsonp | 不是加密,是函数名 |
JWT的特征最明显:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjN9.abc123def456
看到三串Base64用点.分隔,100%是JWT。
直接拿去jwt.io解码,payload里能看到当前用户的身份信息。
第三个技巧:翻前端JS代码
这是最稳妥的方法。打开浏览器开发者工具 → Sources面板 → 翻JS文件。
直接搜关键词:
encryptdecryptAESDESRSACryptoJSciphermd5sha1sha256base64btoa(浏览器的Base64编码函数)atob(浏览器的Base64解码函数)
找到之后看代码:
// 看到这个就是AESCryptoJS.AES.encrypt(data, key, { ... })// 看到这个就是Base64btoa(data)// 看到这个就是MD5CryptoJS.MD5(data)// 看到这个就是JWTjwt.sign(payload, secret)
如果找到了加密函数,在断点处停下,能看到:
- 明文数据
- 加密key
- 加密iv(如果有)
- 输出格式(Base64还是Hex)
第四个技巧:改参数看行为(这个仅作参考)
如果没找到JS,或者JS被混淆了,通过行为也能反推
把加密参数的一个字符改掉:
原:7a8f3b2c1d4e5f6a改:7a8f3b2c1d4e5f6b
看返回:
- 返回“解密失败”或“参数错误” → 后端会解密,且校验完整性
- 返回500报错 → 可能触发了解密异常,报错信息里有线索
- 返回和之前一样 → 可能这个参数根本没用到
改变参数的长度(加一个字符或删一个字符):
- 报错“Invalid length” → AES(长度必须是16的倍数)
- 报错“Base64 decode error” → Base64编码
- 正常返回 → 可能没校验,或者不是加密
同一用户不同请求中,加密参数的变化:
- 每次都变 → 可能用了随机IV或时间戳
- 不变 → 可能是确定性加密或哈希
第五个硬技能:用工具验证
Base64:直接解码(网上也有很多在线加解码工具)
echo \"7a8f3b2c1d4e5f6a\" | base64 -d
如果解码后是明文,说明只是编码,不是加密
JWT:去jwt.io
直接把JWT贴进去,payload就出来了。如果签名算法是none或者密钥是secret,还能伪造
MD5/SHA:没法解密,撞库试试
把哈希值贴到在线彩虹表网站查一下(比如cmd5.com),如果是常见明文,能查出来
比如5d41402abc4b2a76b9719d911017c592 → 查出来是\"hello\"。
AES:需要找key和iv
从JS里找到key和iv,或者从其他接口的返回包里找。找到之后用Python写脚本解密
这过程中,只有不断的翻代码、测试、写脚本
才能找到你想要的明文
⚠️ 法律声明:以上内容仅供安全学习和授权测试使用。未经授权的漏洞利用属于违法行为,请勿对未经授权的目标进行测试。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论