Java类字节码明文暴露Jasypt加密密码,未转字节码原因问询
Common\00mpCryptoPassword\00Ljava/lang/String;\00 ConstantValue\00 \00KHETD645%3DJD$%(?!%*)5\00<init>\00()V\00Code
面临的安全风险
- 所有用
KHETD645%3DJD$%(?!%*)5这个密钥加密的敏感数据可被直接解密:拿到Class文件的攻击者使用相同的org.jasypt.encryption.pbe.StandardPBEStringEncryptor配置,即可直接解密所有你加密存储的数据库密码、接口密钥、用户敏感字段等数据,无任何破解门槛。 - 若你使用该密钥做签名校验、身份认证相关场景,攻击者可直接伪造合法的加密数据、签名串,绕过系统校验,甚至篡改业务数据不会被识别。
为什么字符串会明文出现在Class文件中
这是Java虚拟机规范定义的Class文件标准存储格式,不是编译遗漏:
Java的Class文件结构中存在专门的*常量池(Constant Pool)*区域,所有代码里硬编码的字符串字面量(包括你定义的static final类型字符串常量),都会以UTF-8编码的明文形式存储在常量池的CONSTANT_Utf8_info结构里。你在字节码中看到的明文就是常量池的原始存储内容,这一设计的目的是让JVM加载类时可以快速解析、复用常量,降低运行时内存开销。
javac编译器默认只会做源码到字节码的语法转换,不会主动对代码里的敏感常量做加密处理,这不属于标准编译流程的能力范围。
修复建议
- 禁止在代码中硬编码任何密钥、凭证类敏感信息,正确的做法是将密钥存储在部署环境的环境变量、带权限管控的配置中心、或者专用密钥管理服务(KMS)中,程序启动时动态读取,不会被打包进Class文件。
- 若确实有硬编码的必要,可使用ProGuard、Allatori等混淆工具对字符串常量做混淆加密,增大逆向提取的难度,但该方案只能提升攻击门槛,不能完全替代安全的密钥存储方案。
内容的提问来源于stack exchange,提问作者user230
相关产品推荐
相关产品推荐

