本文目录导读:

我来为你提供一个Java加密工具类的完整案例,包含常见的对称加密(AES)、非对称加密(RSA)和散列函数(SHA-256)。
完整加密工具类
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
import java.security.spec.*;
import java.util.Base64;
/**
* Java加密解密工具类
* 支持:AES对称加密、RSA非对称加密、SHA-256散列
*/
public class CryptoUtils {
private static final String CHARSET = "UTF-8";
// ==================== AES对称加密 ====================
/**
* 生成AES密钥
* @param keySize 密钥长度(128/192/256)
* @return Base64编码的密钥
*/
public static String generateAESKey(int keySize) throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(keySize);
SecretKey secretKey = keyGen.generateKey();
return Base64.getEncoder().encodeToString(secretKey.getEncoded());
}
/**
* AES加密
* @param plainText 明文
* @param base64Key Base64编码的密钥
* @return Base64编码的密文
*/
public static String aesEncrypt(String plainText, String base64Key) throws Exception {
// 解码密钥
byte[] keyBytes = Base64.getDecoder().decode(base64Key);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
// 创建IV向量(随机生成)
byte[] ivBytes = new byte[16];
SecureRandom random = new SecureRandom();
random.nextBytes(ivBytes);
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
// 初始化加密器
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
// 加密
byte[] plainBytes = plainText.getBytes(CHARSET);
byte[] encryptedBytes = cipher.doFinal(plainBytes);
// 组合IV和密文(IV在前,密文在后)
byte[] result = new byte[ivBytes.length + encryptedBytes.length];
System.arraycopy(ivBytes, 0, result, 0, ivBytes.length);
System.arraycopy(encryptedBytes, 0, result, ivBytes.length, encryptedBytes.length);
return Base64.getEncoder().encodeToString(result);
}
/**
* AES解密
* @param encryptedText Base64编码的密文
* @param base64Key Base64编码的密钥
* @return 明文
*/
public static String aesDecrypt(String encryptedText, String base64Key) throws Exception {
// 解码密钥
byte[] keyBytes = Base64.getDecoder().decode(base64Key);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
// 解码密文(包含IV)
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
// 提取IV
byte[] ivBytes = new byte[16];
System.arraycopy(encryptedBytes, 0, ivBytes, 0, 16);
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
// 提取真正的密文
byte[] realEncryptedBytes = new byte[encryptedBytes.length - 16];
System.arraycopy(encryptedBytes, 16, realEncryptedBytes, 0, realEncryptedBytes.length);
// 初始化解密器
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
// 解密
byte[] plainBytes = cipher.doFinal(realEncryptedBytes);
return new String(plainBytes, CHARSET);
}
// ==================== RSA非对称加密 ====================
/**
* 生成RSA密钥对
* @param keySize 密钥长度(建议2048以上)
* @return 包含公钥和私钥的KeyPair对象
*/
public static KeyPair generateRSAKeyPair(int keySize) throws Exception {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(keySize);
return keyGen.generateKeyPair();
}
/**
* 将公钥转换为Base64字符串
*/
public static String publicKeyToBase64(PublicKey publicKey) {
return Base64.getEncoder().encodeToString(publicKey.getEncoded());
}
/**
* 将私钥转换为Base64字符串
*/
public static String privateKeyToBase64(PrivateKey privateKey) {
return Base64.getEncoder().encodeToString(privateKey.getEncoded());
}
/**
* 从Base64字符串恢复公钥
*/
public static PublicKey base64ToPublicKey(String base64Key) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(base64Key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(keySpec);
}
/**
* 从Base64字符串恢复私钥
*/
public static PrivateKey base64ToPrivateKey(String base64Key) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(base64Key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(keySpec);
}
/**
* RSA加密(使用公钥)
*/
public static String rsaEncrypt(String plainText, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(CHARSET));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
/**
* RSA解密(使用私钥)
*/
public static String rsaDecrypt(String encryptedText, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
byte[] plainBytes = cipher.doFinal(encryptedBytes);
return new String(plainBytes, CHARSET);
}
// ==================== SHA-256散列 ====================
/**
* 计算SHA-256散列值
* @param input 输入字符串
* @return 十六进制表示的散列值
*/
public static String sha256(String input) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes(CHARSET));
return bytesToHex(hash);
}
/**
* 带盐值的SHA-256散列
*/
public static String sha256WithSalt(String input, String salt) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(salt.getBytes(CHARSET));
byte[] hash = digest.digest(input.getBytes(CHARSET));
return bytesToHex(hash);
}
// ==================== 辅助方法 ====================
/**
* 字节数组转十六进制字符串
*/
private static String bytesToHex(byte[] bytes) {
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
}
使用示例
public class CryptoDemo {
public static void main(String[] args) {
try {
String originalText = "Hello, Java加密工具!";
// 1. AES加密测试
System.out.println("=== AES加密测试 ===");
String aesKey = CryptoUtils.generateAESKey(256);
System.out.println("AES密钥: " + aesKey);
String aesEncrypted = CryptoUtils.aesEncrypt(originalText, aesKey);
System.out.println("AES密文: " + aesEncrypted);
String aesDecrypted = CryptoUtils.aesDecrypt(aesEncrypted, aesKey);
System.out.println("AES解密: " + aesDecrypted);
// 2. RSA加密测试
System.out.println("\n=== RSA加密测试 ===");
KeyPair keyPair = CryptoUtils.generateRSAKeyPair(2048);
String publicKeyStr = CryptoUtils.publicKeyToBase64(keyPair.getPublic());
String privateKeyStr = CryptoUtils.privateKeyToBase64(keyPair.getPrivate());
System.out.println("公钥: " + publicKeyStr);
System.out.println("私钥: " + privateKeyStr);
String rsaEncrypted = CryptoUtils.rsaEncrypt(originalText, keyPair.getPublic());
System.out.println("RSA密文: " + rsaEncrypted);
String rsaDecrypted = CryptoUtils.rsaDecrypt(rsaEncrypted, keyPair.getPrivate());
System.out.println("RSA解密: " + rsaDecrypted);
// 3. SHA-256散列测试
System.out.println("\n=== SHA-256散列测试 ===");
String hash1 = CryptoUtils.sha256(originalText);
System.out.println("SHA-256: " + hash1);
String salt = "randomSalt123";
String hash2 = CryptoUtils.sha256WithSalt(originalText, salt);
System.out.println("SHA-256(带盐): " + hash2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用建议
- AES加密适用于:大量数据的加密,如文件加密、数据库字段加密
- RSA加密适用于:少量关键数据的加密,如密钥交换、数字签名
- SHA-256适用于:密码存储、数据完整性校验
注意事项
- AES密钥长度建议使用256位
- RSA密钥长度建议使用2048位或以上
- 生产环境请使用更安全的密钥管理方案
- 密钥不要硬编码在代码中,建议使用配置中心或密钥管理服务
这个加密工具类提供了常用的加密功能,你可以根据实际需求进行扩展和优化。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播