Java加解密相关的各种名词的含义,各种分类的算法及特点

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 位)。

相关推荐
天桥下的卖艺者8 小时前
R语言绘制复杂加权数据(nhanes数据)多模型生存分析决策曲线
开发语言·r语言
huohuopro8 小时前
java金额转换,将数字金额转换为7位大写
java·开发语言
珹洺8 小时前
C++从入门到实战(二十二)stack的介绍和使用
开发语言·c++
lionliu05198 小时前
数据库的乐观锁和悲观锁的区别
java·数据库·oracle
赵得C8 小时前
2025下半年软件设计师考前几页纸
java·开发语言·分布式·设计模式·性能优化·软考·软件设计师
im_AMBER8 小时前
Leetcode 79 最佳观光组合
笔记·学习·算法·leetcode
歪楼小能手8 小时前
Android16底部导航栏添加音量加减虚拟按键
android·java·平板