加密

107 阅读7分钟

加密(Cryptography)主要分为两大类:对称加密非对称加密。此外,哈希算法(Hash)虽然不属于传统意义上的加密,但在数据安全中扮演着至关重要的角色,常与加密技术结合使用。


1. 🔑 对称加密 (Symmetric Encryption)

对称加密,也称为私钥加密单密钥加密,是指加密和解密都使用同一把密钥

核心特点

  • 单一密钥: 信息的发送方和接收方共享同一把密钥。
  • 速度快: 计算量小,加解密速度快,适合处理大量数据
  • 缺点: 密钥必须通过安全的渠道分发给通信双方,密钥的安全分发是其最大挑战。

常见算法

  • AES (Advanced Encryption Standard): 当前最广泛使用且被认为是安全的标准,支持 128 位、192 位和 256 位密钥。
  • DES (Data Encryption Standard) / 3DES: DES 已被弃用,3DES(三重 DES)虽然安全性有所提高,但效率较低,也逐渐被淘汰。
  • Symmetric Encryption diagram showing a single key used for both encrypting plaintext into ciphertext and decrypting ciphertext back into plaintext的图片
  • Shutterstock

2. 🔐 非对称加密 (Asymmetric Encryption)

非对称加密,也称为公钥加密 (Public-Key Cryptography) ,使用一对互补的密钥进行加密和解密。

核心特点

  • 密钥对:

    • 公钥 (Public Key): 可以公开分发给任何人,用于加密数据或验证数字签名
    • 私钥 (Private Key): 必须严格保密,用于解密数据或生成数字签名
  • 安全性高: 由于私钥不需要共享,极大地简化了密钥分发过程,安全性更高。

  • 速度慢: 计算复杂,速度远低于对称加密,通常不适合直接加密大量数据。

主要用途

  • 密钥交换: 用于在不安全的通道上安全地协商对称密钥(例如在 TLS/SSL 握手中)。
  • 数字签名: 使用私钥签名,接收方使用公钥验证,用于身份认证和数据完整性校验。

常见算法

  • RSA: 最早且应用最广泛的公钥密码系统之一。
  • ECC (Elliptic Curve Cryptography): 基于椭圆曲线数学理论,在提供相同安全性的情况下,密钥长度比 RSA 短得多,效率更高。
  • Asymmetric Encryption diagram showing Alice using Bob's public key to encrypt a message, and Bob using his private key to decrypt the message的图片
  • Getty Images

3. 🛡️ 哈希算法 (Hash Algorithm)

哈希算法不是加密,因为它只进行单向转换,是不可逆的。它将任意长度的输入(数据)转换为固定长度的输出(哈希值消息摘要)。

核心特性

  • 单向性(不可逆): 无法从哈希值反推出原始数据。
  • 固定长度: 无论输入数据多长,输出的哈希值长度固定。
  • 雪崩效应: 原始数据中的微小变化会导致最终哈希值发生巨大变化。
  • 防冲突: 理想情况下,不同的输入不应产生相同的哈希值(尽管在数学上无法完全避免)。

主要用途

  • 数据完整性校验: 检查文件在传输或存储过程中是否被篡改(如下载文件后的 MD5/SHA 校验)。
  • 密码存储: 数据库中只存储用户密码的哈希值,即使数据库泄露,攻击者也无法直接获取原密码。
  • 数字签名和证书: 用于生成和验证数字签名,确保数据来源和完整性。

常见算法

  • SHA 系列 (Secure Hash Algorithm): 包括 SHA-1(已不推荐)、SHA-256、SHA-512 等。SHA-256 是目前应用广泛的哈希标准。
  • MD5: 因存在严重的安全漏洞,目前仅用于非安全的文件校验,不应用于密码存储等安全场景。

结合应用:混合加密系统

在现代网络通信中(如 HTTPS 使用的 TLS/SSL 协议),通常采用混合加密机制:

  1. 非对称加密(如 RSA 或 ECC)用于安全地协商并交换一个临时的对称密钥(会话密钥)。
  2. 对称加密(如 AES)使用这个会话密钥来对实际传输的大量数据进行高速加解密。
  3. 哈希算法(如 SHA-256)用于对数据进行完整性校验数字签名

在 Java 的生态系统和框架中,你可以利用多种工具和库来实现各种加密和安全需求。Java 在安全方面有着悠久的历史,其核心库和大量第三方库都提供了强大的支持。


在java生态中

** 🚀 Java 核心安全 API (JCE / JCA)

Java 平台本身提供了一套强大的安全 API,这是所有 Java 加密应用的基石。

JCA / JCE 核心模块

模块作用常见算法
JCA (Java Cryptography Architecture)提供基本的加密框架和概念,如密钥库、数字签名等。-
JCE (Java Cryptography Extension)提供高级的加密功能,包括对称/非对称加密、哈希等算法的具体实现。AES, RSA, DES, SHA-256
JSSE (Java Secure Socket Extension)实现了 SSL/TLS 协议,用于保护网络通信。TLS 1.2/1.3

核心 API 使用

  • 对称加密: 使用 Cipher 类配合 AES 算法,用于加密大量数据。

    Java

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    
  • 非对称加密: 使用 KeyPairGenerator 生成 RSA 密钥对,Cipher 进行加解密。

    Java

    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    
  • 哈希/消息摘要: 使用 MessageDigest 类进行单向散列。

    Java

    MessageDigest md = MessageDigest.getInstance("SHA-256");
    byte[] hash = md.digest(data);
    

🛠️ 2. 身份验证与授权(认证/授权)

加密技术是实现认证和授权的基础。

密码安全存储

  • Bcrypt / Scrypt / Argon2: JCE 提供了基本的哈希算法(如 SHA-256),但对于密码存储,这些算法太快且容易被暴力破解。

  • 推荐做法: 使用专门设计用于密码存储的慢哈希算法:

    • Spring Security: 内置了 BCryptPasswordEncoderSCryptPasswordEncoder,强烈推荐使用它们来处理用户密码的哈希。

数字证书和 PKI

  • KeyStore: Java 提供了 KeyStore 类来管理密钥和数字证书,通常以 JKSPKCS#12 格式存储。这在部署 HTTPS 服务时非常重要。
  • 数字签名: 使用 Signature 类配合非对称密钥对数据进行签名和验签,用于验证数据的完整性和来源。

📚 3. 第三方加密与安全库

为了更方便、更安全地处理复杂的加密任务,Java 生态中有许多优秀的第三方库。

A. Bouncy Castle

  • 作用: 这是一个功能非常强大的密码学 API 和 JCE 提供者。它实现了许多 JCE/JCA 标准中没有包含的算法,并且提供了更广泛的密码学工具。
  • 应用: 常用于实现复杂的加密标准、处理 PGP、SM 系列国密算法等。

B. Apache Commons Codec

  • 作用: 主要提供编码/解码工具,虽然不是严格的“加密”库,但它提供了加密过程中常用的Base64Hex编码/解码功能。
  • 应用: 方便地将二进制数据(如加密后的密文)转换为文本格式进行传输。

C. Spring Security 🛡️

  • 作用: 这是 Java 企业应用中最主流的安全框架。它本身不实现加密算法,但它封装了 JCE 和其他安全库,提供了声明式安全和强大的安全上下文

  • 应用场景:

    • 认证 (Authentication): 处理登录、用户凭证管理。
    • 授权 (Authorization): 控制用户对资源的访问权限。
    • OAuth 2.0 / JWT: 支持现代授权协议和无状态 Token 机制。

🌐 4. 传输层安全(TLS/SSL)

在 Java 应用中,保护网络通信是加密最常见的需求。

  • 内置支持: Java 的 HttpURLConnectionHttpClient 等网络库都内置HTTPS 的支持,底层通过 JSSE 实现 TLS 协议。
  • Web 服务器: 无论是 Tomcat、Jetty 还是 Spring Boot 内嵌的容器,配置 HTTPS(需要提供私钥和证书)后,所有网络传输都会自动使用 TLS 进行加密。

总结: 在 Java 生态中,你应该优先使用 JCE/JCA 核心 API 来实现基础的加解密,使用 Spring Security 来处理应用层的安全认证和授权,并在需要扩展算法或处理复杂标准时引入 Bouncy Castle 等第三方库。