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

相关推荐
燃于AC之乐23 分钟前
我的算法修炼之路--4 ———我和算法的爱恨情仇
算法·前缀和·贪心算法·背包问题·洛谷
Boilermaker19926 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维6 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS6 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
独自破碎E6 小时前
【二分法】寻找峰值
算法
꧁Q༒ོγ꧂6 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs6 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_996 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子6 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34167 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java