【Java实战】Java加解密算法全解析:分类、场景与国密算法实战总结

【Java实战】Java加解密算法全解析:分类、场景与国密算法实战总结 作者简介大家好我是CodeStats。一个在底层技术上“考古”了四年的硬核爱好者也是WWAIC全周项目AI编程范式的提出者和实践者。我曾手写过一个完整的Java Web框架从IoC容器到嵌入式Tomcat代码全开源也喜欢用通俗的语言拆解CPU、JVM、操作系统的运行本质。我的技术信条所有高深的技术最后都能用大白话讲清楚。如果讲不清楚说明还没真正理解。 本文获取你将学到什么读完这篇文章你将彻底搞懂以下5个核心问题从此Java加解密面试对你不再设防序号你将掌握的知识点解决的核心困惑①Java加解密算法的三大分类对称加密、非对称加密、哈希算法到底是什么②对称加密 vs 非对称加密的使用场景、密钥长度和密文长度什么时候用AES什么时候用RSA③哈希算法有哪些如何利用MD5进行登录验证加盐怎么用密码为什么不能明文存储④国密算法SM2/SM3/SM4分别是什么类型对应哪些国际算法国密算法如何对标国际标准⑤SM4有哪些工作模式CBC/CTR/GCM区别是什么Base64和Hex长度有何区别为什么需要IV向量SM4怎么选模式IV是什么一、Java加解密算法如何分类Java中的加解密算法通常可以分为三大类1.1 对称加密Symmetric Encryption定义加密和解密使用同一个密钥的加密算法。特点✅ 加密速度快、效率高适合大量数据加密❌ 密钥分发和管理困难——如何安全地把密钥告诉对方常见算法AES、DES、3DES、SM41.2 非对称加密Asymmetric Encryption定义加密和解密使用一对密钥公钥Public Key和私钥Private Key。公钥加密的数据只能用对应的私钥解密。特点✅ 安全性高解决了密钥分发问题❌ 速度较慢不适合加密大量数据常见算法RSA、ECC椭圆曲线加密、DSA、SM21.3 哈希算法Hash Algorithm / Message Digest定义将任意长度的数据转换成固定长度的、不可逆的哈希值散列值。特点单向、不可逆无法从哈希值还原出原始数据✅ 主要用于验证数据完整性而非加密常见算法MD5、SHA-1、SHA-256、SM3二、对称加密和非对称加密使用场景、密钥长度与密文长度2.1 使用场景对比对比维度对称加密非对称加密密钥数量1个加解密共用2个公钥加密私钥解密加密速度✅ 快❌ 慢密钥分发❌ 困难✅ 安全公钥可公开典型场景大量数据加密、数据库字段加密密钥分发、数字签名、身份认证代表算法AES、SM4RSA、SM2工程实践中的黄金组合用非对称加密如RSA/SM2安全地传输对称加密如AES/SM4的密钥然后用对称加密来加密实际的大量数据。这就是混合加密的经典模式。2.2 密钥长度算法密钥长度位密钥长度字节AES128 / 192 / 25616 / 24 / 32 字节SM4128固定16 字节RSA2048 / 3072 / 4096256 / 384 / 512 字节SM2256固定32 字节⚠️注意1字节 8位。所以“128位”就是“16字节”。代码中常遇到InvalidKeyException多半是密钥字节数不对。2.3 密文长度算法密文长度说明AES/SM4对称与明文等长填充后分组加密需按块大小16字节填充RSA非对称与密钥长度相同如2048位密钥 → 密文256字节SM2非对称64 明文长度 32 字节C1固定64字节 C2(明文) C3固定32字节为什么RSA不能加密大数据RSA加密的明文必须比密钥长度少11字节PKCS#1填充。例如2048位256字节的RSA密钥最多只能加密245字节的明文。所以RSA通常只用来加密对称密钥或小数据。三、哈希算法有哪些如何利用MD5进行登录验证3.1 常见哈希算法算法输出长度位输出长度字节安全性MD512816❌ 已破解不推荐用于安全场景SHA-116020❌ 已破解SHA-25625632✅ 安全SM325632✅ 安全3.2 为什么密码不能明文存储如果数据库被攻破所有用户的明文密码将直接暴露。正确的做法是存储密码的哈希值而非明文。3.3 MD5登录验证流程⚠️ 注意MD5已不安全仅作原理演示注册时text用户密码 123456 → MD5加密 → e10adc3949ba59abbe56e057f20f883e → 存入数据库登录时text用户输入 123456 → MD5加密 → e10adc3949ba59abbe56e057f20f883e → 与数据库比对 → ✅ 一致则登录成功3.4 加盐Salting场景示例为什么需要加盐不加盐的话相同密码会产生相同的MD5值。黑客可以用彩虹表预先计算的MD5字典快速破解。加盐后的流程注册时text1. 为用户生成随机盐值如 xYz9Kj3M 2. 计算MD5(密码 盐值) a8f5d6e7c8b9a1... 3. 存储{MD5值, 盐值} 到数据库登录时text1. 根据用户名取出 {存储的MD5, 盐值} 2. 计算MD5(用户输入密码 盐值) 3. 比对是否一致加盐的效果即使两个用户的密码都是123456由于盐值不同最终存储的哈希值也完全不同彩虹表彻底失效。⚠️ 生产环境强烈建议MD5已经过时。对于新项目强烈推荐使用 BCrypt、SCrypt 或 Argon2它们内置加盐且被设计为“慢哈希”能有效抵抗暴力破解。四、国密算法SM2/SM3/SM4分别是什么对应什么国际算法国密算法是国家密码管理局认定和发布的一系列具有自主知识产权的国产密码算法标准。国密算法算法类型对标国际算法主要用途SM2非对称加密椭圆曲线RSA / ECDSA / ECDH数字签名、密钥交换、公钥加密SM3哈希算法杂凑算法SHA-256数据完整性校验、消息认证SM4对称加密分组密码AES大量数据加密4.1 SM2非对称加密SM2基于椭圆曲线密码ECC用256位密钥就能达到RSA 2048/3072位的同等安全强度。主要包含数字签名、密钥交换和公钥加密三大功能。4.2 SM3哈希算法SM3是密码杂凑算法输出256位32字节的哈希值用于替代MD5/SHA-1/SHA-256等国际算法。4.3 SM4对称加密SM4是分组对称密码算法分组长度和密钥长度均为128位16字节。它承担了生产环境中最繁重的数据加解密任务。国密TLS的经典组合SM2证书 SM4加密 SM3哈希构成完整的国产加密通信套件。五、SM4的工作模式CBC/CTR/GCM区别、Base64 vs Hex、为什么需要IV5.1 SM4有哪些工作模式SM4作为分组密码块大小128位/16字节需要工作模式来处理任意长度的数据。常见模式包括ECB、CBC、CFB、OFB、CTR、GCM、CCM、XTS。5.2 CBC vs CTR vs GCM 核心对比对比维度CBCCTRGCM是否需要填充✅ 需要PKCS7Padding❌ 不需要❌ 不需要加密可并行❌ 不可并行✅ 完全可并行✅ 完全可并行解密可并行✅ 可并行✅ 完全可并行✅ 完全可并行完整性校验❌ 无❌ 无✅ 自带认证标签AEAD推荐度⚠️ 可用兼容性好✅ 推荐高性能⭐强烈推荐CBC模式每个明文块先与前一个密文块异或再加密。加密必须串行但解密可以并行。CTR模式通过加密计数器生成密钥流再与明文异或。加解密完全可并行性能极高。GCM模式在CTR基础上增加了消息认证功能同时提供加密和完整性校验AEAD模式。这是目前最安全、最现代的选择。5.3 为什么需要IV向量IV初始化向量的作用是确保相同明文在不同次加密中产生不同的密文。CBC模式IV必须随机且不可预测长度固定为16字节CTR/GCM模式IV常称Nonce必须唯一GCM推荐12字节⚠️致命陷阱CTR和GCM模式下同一密钥的Nonce绝对不允许重复使用否则密钥流会重复攻击者可通过异或直接破解明文。5.4 Base64编码 vs Hex编码长度有何区别加密后的密文是二进制字节数组需要编码成文本才能传输或存储。两种常见编码方式编码方式说明16字节密文的长度Hex十六进制1字节 → 2个十六进制字符16 × 2 32字符Base64每3字节 → 4个字符⌈16/3⌉ × 4 24字符为什么长度不同Hex简单直接每个字节拆成两个字符长度固定为密文长度 × 2Base64用64个可打印字符表示二进制压缩效率更高长度约为密文长度 × 4/3选哪个Hex可读性好适合调试、日志Base64更紧凑适合网络传输 总结算法分类核心特点代表算法典型场景对称加密一个密钥加解密快AES、SM4大量数据加密非对称加密公钥/私钥对慢但安全RSA、SM2密钥分发、数字签名哈希算法不可逆固定长度SHA-256、SM3密码存储、完整性校验Java中的加密框架Java通过JCAJava Cryptography Architecture和JCEJava Cryptography Extension提供加密功能的框架和API。核心类是javax.crypto.Cipher它整合了算法/工作模式/填充模式。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注后续会持续输出更多Java技术干货有疑问欢迎在评论区留言交流