Java 加解密是信息安全的核心,涉及大量专业名词和算法分类,理解这些概念是实现数据加密、签名、验签的基础。以下按「核心名词」「算法分类」「典型算法及特点」三层拆解,结合 Java 实操场景讲透:
一、常见名词含义:

二、加解密算法核心分类(按功能划分)
Java 加解密算法主要分为 4 大类,各自解决不同安全问题:

三、各类算法详解(特点 + Java 支持 + 适用场景)
1. 对称加密算法(对称密钥算法)
核心逻辑:加密和解密使用同一把密钥(SecretKey),算法核心是 "混淆" 和 "扩散",性能极高(比非对称快 100~1000 倍)。
(1)核心特点
✅ 优点:加解密速度快,适合大文件 / 大数据加密;
❌ 缺点:密钥需在通信双方安全传输(密钥泄露则数据全泄露);
关键参数:密钥长度、加密模式(ECB/CBC/CTR/GCM)、填充方式(Padding)。
(2)典型算法对比

(3)关键补充:对称加密模式(Mode)
不同模式决定明文分组的加密方式,Java 中常用:
ECB:电子密码本,每个分组独立加密(相同明文生成相同密文,不安全 );
CBC:密码分组链接,依赖前一分组结果,需指定 IV(初始化向量),安全性高;
GCM:伽罗瓦 / 计数器模式,支持加密 + 完整性校验,无需额外哈希,推荐高并发场景。
Java 示例(AES-CBC 加密):
java
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AesDemo {
// AES-128-CBC 加密(128位密钥,CBC模式,PKCS5填充)
public static String aesEncrypt(String plaintext, String key, String iv) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
byte[] cipherBytes = cipher.doFinal(plaintext.getBytes());
return Base64.getEncoder().encodeToString(cipherBytes);
}
}
2. 非对称加密算法(公钥密码算法)
核心逻辑:生成一对密钥(公钥 PublicKey + 私钥 PrivateKey),公钥可公开,私钥需保密:
公钥加密 → 私钥解密(用于加密数据,仅私钥持有者可解密);
私钥签名 → 公钥验签(用于数字签名,证明数据来自私钥持有者)。
(1)核心特点
✅ 优点:密钥无需传输,解决对称加密的密钥交换问题;
❌ 缺点:加解密速度慢(仅适合小数据加密,如对称密钥、签名);
关键参数:密钥长度(越长越安全,但速度越慢)。
(2)典型算法对比
关键对比:256 位 ECC 的安全性 ≈ 3072 位 RSA,但 ECC 加解密速度是 RSA 的数倍,适合资源受限场景(如手机、嵌入式设备)。
Java 示例(RSA 公钥加密):
java
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class RsaDemo {
// RSA 公钥加密(仅适合小数据,如AES密钥)
public static String rsaEncrypt(String plaintext, String publicKeyStr) throws Exception {
byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
PublicKey publicKey = KeyFactory.getInstance("RSA")
.generatePublic(new X509EncodedKeySpec(publicKeyBytes));
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherBytes = cipher.doFinal(plaintext.getBytes());
return Base64.getEncoder().encodeToString(cipherBytes);
}
}
3. 哈希算法(摘要算法)
核心逻辑:将任意长度的明文转换为固定长度的哈希值(摘要),不可逆(无法从哈希值反推明文),核心用于数据完整性校验。
(1)核心特点
✅ 优点:不可逆、定长输出、计算快;
❌ 缺点:可能存在 "哈希碰撞"(不同明文生成相同哈希值);
关键属性:抗碰撞性(越难碰撞越安全)、雪崩效应(明文微小变化导致哈希值巨变)。
(2)典型算法对比

(3)关键补充:加盐哈希(Salt)
哈希算法不可逆,但彩虹表(预计算的明文 - 哈希库)可破解简单密码,因此密码存储需 "加盐":
盐(Salt):随机字符串,每个密码对应不同盐;
流程:哈希(明文密码 + 盐),存储 "盐 + 哈希值",验证时重新计算比对。
Java 示例(SHA-256 加盐哈希):
java
import java.security.MessageDigest;
import java.util.Random;
public class HashDemo {
// 生成随机盐(16位)
public static String generateSalt() {
Random random = new Random();
byte[] salt = new byte[16];
random.nextBytes(salt);
return Base64.getEncoder().encodeToString(salt);
}
// SHA-256 加盐哈希
public static String sha256WithSalt(String password, String salt) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt.getBytes()); // 先更新盐
byte[] hashBytes = md.digest(password.getBytes()); // 再哈希密码
return Base64.getEncoder().encodeToString(hashBytes);
}
}
4. 数字签名算法
核心逻辑:结合 "非对称加密 + 哈希算法",解决 "数据来源认证 + 完整性校验 + 不可抵赖" 问题:
签名流程:哈希(明文) → 私钥加密哈希值 = 签名;
验签流程:公钥解密签名 = 哈希值1 → 哈希(明文) = 哈希值2 → 比对哈希值1/2。
(1)典型算法对比

Java 示例(RSA 签名):
java
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class SignatureDemo {
// RSA 私钥签名
public static String rsaSign(String plaintext, String privateKeyStr) throws Exception {
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
PrivateKey privateKey = KeyFactory.getInstance("RSA")
.generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(plaintext.getBytes());
byte[] signBytes = signature.sign();
return Base64.getEncoder().encodeToString(signBytes);
}
}
四、Java 加解密核心工具类
Java 提供了统一的加解密框架(JCA/JCE),核心类:

五、选型建议(开发落地)

总结
Java 加解密的核心是 "按需选算法":
对称加密(AES):高效加密数据,解决 "数据保密";
非对称加密(RSA/ECC):安全交换密钥,解决 "密钥泄露";
哈希算法(SHA-256):校验数据完整性,解决 "数据篡改";
数字签名(RSA-SHA256):验证数据来源,解决 "身份伪造"。
国密算法(SM2/SM3/SM4)是国内项目的强制要求,需注意引入第三方库(BouncyCastle)适配;所有算法的密钥长度需符合当前安全标准(如 RSA 至少 2048 位,AES 至少 128 位)。