Java原生JCA/JCE框架可完成基础加密与摘要,需正确选用标准类、规避配置陷阱并明确算法边界:AES推荐GCM模式或CBC+PKCS7Padding,密钥用KeyGenerator生成,IV须随机且唯一;摘要用SHA-256并显式指定UTF-8编码,密码哈希须加盐,API签名用HmacSHA256;密钥禁硬编码,应存KeyStore或HSM,临时密钥用后清零;SecureRandom为唯一安全随机源;加解密结果应封装完整参数,异常捕获GeneralSecurityException。

Java原生安全框架(JCA/JCE)无需第三方库就能完成基础加密与摘要,关键在于正确选用标准类、避免常见配置陷阱,并理解每种算法的适用边界。
对称加密:用AES保护敏感数据
AES是Java中最常用且安全的对称加密方案,但直接套用默认参数容易出问题。必须明确指定模式和填充,并使用随机IV。
- 不要用
AES/ECB/PKCS5Padding——ECB模式不安全,相同明文块总生成相同密文,易被模式分析 - 推荐
AES/GCM/NoPadding:自带认证,抗篡改,且无需额外填充;若必须用CBC,则搭配PKCS7Padding并确保每次加密都生成新IV - IV必须随密文一起保存或传输,长度固定为12字节(GCM)或16字节(CBC),用
SecureRandom生成,绝不可复用 - 密钥建议用
KeyGenerator生成(如KeyGenerator.getInstance("AES").init(256)),而非硬编码字符串——后者易因字符编码差异导致密钥长度错误
消息摘要:用SHA-256校验数据完整性
摘要算法用于验证内容是否被篡改,不可逆,也不加密。Java内置支持,但要注意编码一致性。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 始终显式指定字符集,例如
digest.update(data.getBytes(StandardCharsets.UTF_8)),避免平台默认编码引发哈希不一致 - SHA-256比MD5/SHA-1更安全,NIST已不推荐后两者用于安全场景
- 单纯哈希不防彩虹表攻击——存储密码时务必加盐(salt),且盐值需唯一、随机、存于数据库中与哈希值同级字段
- 若需带密钥的摘要(如API签名),应使用
HmacSHA256,密钥通过SecretKeySpec构造,不能直接用字符串
密钥与初始化向量的安全管理
再强的算法也架不住密钥泄露或IV重复。Java提供了基础工具,但需主动约束使用方式。
立即学习“Java免费学习笔记(深入)”;
-
SecureRandom是唯一推荐的随机源,替代java.util.Random——后者可预测,不满足密码学强度 - 密钥绝不硬编码,生产环境应存入
KeyStore(如JKS或PKCS#12格式),或由HSM托管 - 临时密钥(如会话密钥)可内存生成,但用完立即清零:
Arrays.fill(keyBytes, (byte)0) - IV、salt等辅助参数虽非密钥,但也需安全生成并随数据持久化,通常Base64编码后与密文/摘要拼接存储
典型代码结构要点
一个健壮的加解密流程不是堆砌API,而是封装关键决策点。
- 加密方法应返回完整结果对象(含密文+IV+算法标识),而非仅密文字符串
- 解密前先校验IV长度、算法标识是否匹配,避免
BadPaddingException掩盖真实错误 - 摘要计算统一返回小写十六进制字符串(如
Hex.encodeHexString(hash)),避免大小写混用导致比对失败 - 所有异常需捕获
GeneralSecurityException及其子类,不抛出裸Exception,便于上层区分安全失败与系统故障

















