云计算百科
云计算领域专业知识百科平台

Java学习第一百三十部分——加密

目录

一、前言简介

二、对称加密(AES – 最常用)

三、非对称加密(RSA)

四、哈希算法(SHA-256)

五、使用KeyStore管理密钥(高级)

六、对比使用

七、注意事项


一、前言简介

  • 在Java中实现加密功能主要依赖于Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE)。

  • Java Cryptography Architecture (JCA) 是 Java 平台的核心安全框架,提供了一套标准化的 API 用于实现加密、密钥管理、数字签名、消息摘要等安全功能。它采用提供者架构(Provider Architecture),允许开发者灵活选择不同的加密实现,同时保持代码的算法独立性。

  • Java Cryptography Extension(JCE)是 Java 平台的核心加密框架,提供了一套标准化的 API 用于实现加密、密钥管理、消息认证码(MAC)、安全流等高级安全功能。它是 Java 安全体系(JCA)的扩展,专注于提供强加密能力,现已成为 Java 标准库的核心组件(JDK 1.4+ 起集成)。

二、对称加密(AES – 最常用)

  • 核心概念:使用同一个密钥进行加密和解密

  • 特点:

    • 速度快,适合大数据量加密

    • 密钥需要安全传输(主要缺点)

  • 常见算法:AES(128/256位)、DES(已淘汰)

  • 应用场景:

    • 文件加密(如加密压缩包)

    • 数据库字段加密

    • HTTPS通信中的会话密钥

  • Java示例:

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESEncryption {
private static final String ALGORITHM = "AES";

public static String encrypt(String data, String secretKey) throws Exception {
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}

public static String decrypt(String encryptedData, String secretKey) throws Exception {
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes);
}

public static void main(String[] args) throws Exception {
String secretKey = "ThisIsASecretKey"; // 必须16/24/32字节
String original = "Hello, World!";

String encrypted = encrypt(original, secretKey);
System.out.println("加密后: " + encrypted);

String decrypted = decrypt(encrypted, secretKey);
System.out.println("解密后: " + decrypted);
}
}

三、非对称加密(RSA)

  • 核心概念:使用密钥对(公钥加密,私钥解密)

  • 特点:

    • 解决密钥传输问题(公钥可公开)

    • 速度慢(比对称加密慢1000倍)

  • 常见算法:RSA、ECC(椭圆曲线)

  • 应用场景:

    • 数字签名(验证身份)

    • SSL/TLS握手

    • 加密对称密钥(混合加密)

  • Java示例:

import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;

public class RSAEncryption {
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048); // 密钥长度
return generator.generateKeyPair();
}

public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}

public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes);
}

public static void main(String[] args) throws Exception {
KeyPair keyPair = generateKeyPair();

String original = "Secret Message";
String encrypted = encrypt(original, keyPair.getPublic());
System.out.println("加密后: " + encrypted);

String decrypted = decrypt(encrypted, keyPair.getPrivate());
System.out.println("解密后: " + decrypted);
}
}

四、哈希算法(SHA-256)

  • 核心概念:生成数据的唯一指纹(不可逆)

  • 特点:

    • 单向函数(无法解密)

    • 相同输入永远产生相同输出

    • 雪崩效应(微小改动结果巨变)

  • 常见算法:SHA-256、SHA-3、MD5(已不安全)

  • 应用场景:

    • 密码存储(加盐哈希)

    • 数据完整性校验

    • 区块链交易验证

  • Java示例:

import java.security.MessageDigest;
import java.util.HexFormat;

public class HashExample {
public static String sha256(String input) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes());
return HexFormat.of().formatHex(hash); // Java 17+ 的十六进制转换
}

public static void main(String[] args) throws Exception {
String data = "Password123!";
String hashed = sha256(data);
System.out.println("SHA-256 哈希值: " + hashed);
}
}

五、使用KeyStore管理密钥(高级)

  • 核心概念:安全管理密钥和证书的保险箱

  • 特点:

    • 密码保护访问

    • 支持硬件加密模块(HSM)

    • 可存储多种类型密钥

  • 常见格式:JKS(Java原生)、PKCS12(跨平台)

  • 应用场景:

    • SSL服务器证书存储

    • 应用配置加密密钥

    • 代码签名证书管理

  • Java示例:

import java.security.*;
import java.security.cert.Certificate;

public class KeyStoreExample {
public static void main(String[] args) throws Exception {
// 创建KeyStore
KeyStore keyStore = KeyStore.getInstance("PKCS12");
char[] password = "keystorePass".toCharArray();
keyStore.load(null, password); // 初始化空KeyStore

// 生成密钥并存储
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
SecretKey secretKey = keyGen.generateKey();
KeyStore.SecretKeyEntry keyEntry = new KeyStore.SecretKeyEntry(secretKey);
keyStore.setEntry("myAESKey", keyEntry, new KeyStore.PasswordProtection(password));

// 从KeyStore获取密钥
Key key = keyStore.getKey("myAESKey", password);
System.out.println("恢复的密钥: " + key.getAlgorithm());
}
}

六、对比使用

类型密钥管理速度安全性重点典型用途
对称加密 单一密钥(需保密) ⚡ 极快 密钥长度(AES-256) 大数据加密
非对称加密 密钥对(公钥/私钥) 🐢 慢 密钥长度(RSA-2048) 密钥交换/数字签名
哈希算法 无需密钥 ⚡ 快 抗碰撞性 密码存储/数据校验
密钥库 集中保管多密钥 访问控制 密钥生命周期管理

七、注意事项

1. 密钥管理:

  • 对称加密:密钥需安全存储(避免硬编码),推荐使用Java KeyStore

  • 非对称加密:私钥必须严格保护,公钥可分发

2. 算法选择:

  • 对称加密:AES(128/256位)

  • 非对称加密:RSA(≥2048位)或 ECC

  • 哈希:SHA-256 或 SHA-3

  • 避免使用:DES、MD5、SHA-1(已不安全)

3. 增强安全性:

// 使用更安全的加密模式(如GCM)
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

// 密码加密使用PBKDF2
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");

4. 依赖:Java标准库已包含JCE,无需额外依赖

> 重要提示:生产环境务必咨询相关技术人员,加密实现错误可能导致严重漏洞!

赞(0)
未经允许不得转载:网硕互联帮助中心 » Java学习第一百三十部分——加密
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!