
该问题直指移动/Java应用中常见的硬编码密钥风险:将AES密钥(如"1111111111111111")直接写死在源码中,属于典型的高危安全漏洞,一旦代码泄露或APK被逆向,攻击者即可完全解密敏感数据。
该问题直指移动/java应用中常见的硬编码密钥风险:将aes密钥(如`"1111111111111111"`)直接写死在源码中,属于典型的**高危安全漏洞**,一旦代码泄露或apk被逆向,攻击者即可完全解密敏感数据。
在您发现的这段代码中:
public class Constant {
public static final String AES_KEY = "1111111111111111"; // 16字节 = AES-128有效密钥
public static final String AES_VECTOR = "1111111111111111"; // 同样硬编码的IV(初始向量)
}以及调用逻辑:
public static byte[] encrypt4CBC128(String str) {
return encrypt4CBC128(str, "1111111111111111", "1111111111111111");
}这构成了双重硬编码缺陷:
✅ 密钥硬编码(Critical):AES_KEY 是对称加密的核心秘密,必须严格保密。将其以明文字符串形式固化在 Constant.class 中,等同于把保险柜密码刻在门上——任何能获取APK(通过反编译 classes.dex)或源码仓库(如GitHub误提交)的攻击者,均可立即还原全部加解密逻辑。
✅ IV硬编码(High):AES_VECTOR 在CBC模式下作为初始向量,必须唯一且不可预测。重复使用相同IV+密钥会导致相同明文生成相同密文前缀,严重削弱语义安全性,甚至引发填充预言攻击(Padding Oracle)或明文恢复风险。此处固定为16个'1',完全违背CBC最佳实践。
? 补充说明:
-
"1111111111111111"是16字节ASCII字符串(十六进制=0x313131...),虽满足AES-128密钥长度要求,但熵值极低(仅含单一字符),极易被暴力破解或字典攻击; -
AES_KEY_PRE = "214028"看似短密钥,若被用于密钥派生(如PBKDF2),仍需警惕其弱口令属性; - 即使该密钥仅用于“测试环境”,也构成策略性风险:开发人员易沿用至生产环境;自动化扫描工具(如MobSF、SonarQube、GitLeaks)会将其标记为
CWE-321(Use of Hard-coded Cryptographic Key),触发合规告警(如等保2.0三级要求“密钥不得硬编码”)。
?️ 正确实践建议:
- 密钥动态化:采用Android Keystore(推荐)或iOS Keychain安全存储密钥,禁止内存明文驻留;
-
IV随机化:每次加密前用
SecureRandom生成全新16字节IV,并与密文一同传输(如拼接为IV||CIPHERTEXT); -
密钥派生强化:若必须基于口令生成密钥,使用
PBKDF2WithHmacSHA256+ ≥10万次迭代 + 随机salt; -
静态检测覆盖:在CI/CD中集成
truffleHog或gitleaks扫描硬编码密钥,阻断带密提交。
⚠️ 注意:不要因“当前未发现数据泄露”而低估风险。真实攻击链往往是——逆向APK → 提取硬编码密钥 → 解密本地数据库(如Room加密字段)或网络缓存 → 获取用户身份证、银行卡等高敏信息。一次硬编码,可能成为整条数据防线的突破口。
请立即将此类密钥从源码中移除,并推动团队建立密钥全生命周期管理规范(生成→分发→轮换→销毁)。安全不是功能开关,而是每一行代码的责任。

















