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,无需额外依赖

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值