摘要:在Java开发中,加密解密技术是保护数据安全的重要手段。无论是存储敏感信息(如用户密码、个人信息)还是传输加密数据,都需要用到加密算法。不同的加密算法运用的场景也不同,因此选择合适的加密解密算法也是至关重要。
一、加密算法分类
加密算法的种类繁多,主要可以归纳为以下几大类:
一、对称加密算法
- 定义:加密和解密使用相同密钥的加密算法。
- 特点:加密强度高,效率高,但密钥分发和管理较为复杂。
- 常见算法:
- DES:一种使用对称密钥加密的块算法,由IBM公司于1975年研发,是广泛应用的早期对称加密算法之一,但由于密钥长度较短(56位),安全性已逐渐降低。
- 3DES:DES算法的一个更安全的变形,使用3条56位的密钥对数据进行三次加密,提高了安全性,是DES算法向AES算法过渡的算法。
- AES:高级加密标准(Advanced Encryption Standard),是一种分块加密算法,用于替代原先的DES算法。AES算法由三种不同的算法组成,分别使用128、192或256位加密密钥,具有高强度、高速度和易于实现的特点。
- RC4:一种流密码算法,由Ron Rivest于1987年创建,通过生成一个伪随机数流与明文进行异或运算来实现加密,具有速度快、简单易用、灵活性高以及适用范围广的特点。
- 其他还包括Blowfish、IDEA、RC5、RC6等算法。
二、非对称加密算法
- 定义:非对称加密算法是指加密和解密使用不同密钥的加密算法,通常包含公钥和私钥。公钥用于加密,私钥用于解密(或反之用于验签)。
- 特点:加密速度慢,但强度高,适用于密钥交换和数字签名等场景。
- 常见算法:
- RSA:一种基于公钥加密的算法,广泛应用于SSL证书中的密钥交换和数字签名过程,助力网站实现HTTPS加密,确保网络通信安全。
- ECC:基于椭圆曲线密码学的加密算法,相比于RSA算法,ECC算法提供了更高的安全性和更短的密钥长度。
- 其他还包括Diffie-Hellman、El Gamal、DSA(数字签名用)等算法。
三、哈希算法
- 定义:也叫安全散列算法、消息摘要算法、杂凑算法,是一种将任意长度的输入数据输出为固定长度数据的算法,具有单向性,即不能通过输出数据反推出输入数据。
- 特点:可实现数据签名、数据完整性校验等功能。
- 常见算法:
- MD5:一种加密散列函数算法,将任意长度的信息作为输入,并转换为128位(16字节)的固定长度信息,主要用于验证文件是否被篡改。但近年来,由于其哈希值长度较短,安全性逐渐受到质疑。
- SHA系列:包括SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)等算法,其中SHA-1算法可以生成160位(20字节)散列值,而SHA-2算法则是SHA-1算法的继承者,提供了更高的安全性。SHA系列算法广泛应用于文件传输校验、代码签名证书等领域。
- 其他还包括MD2、MD4、HAVAL等算法,但部分算法由于安全性问题已逐渐被淘汰。
二、加密算法实现
本文将介绍几种Java中常用的加密解密算法,并提供相应的使用示例。
对称加密算法
DES算法
DES(Data Encryption Standard)是一种古老的对称加密算法,它以64位为分组长度,密钥长度为56位,8位用于奇偶校验。
在Java中,可以使用javax.crypto.Cipher类来执行DES加密和解密。
import com.alibaba.fastjson.JSON;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
/**
* DES算法加解密工具类
*/
public class DESUtil {
/**
* 生成DES密钥
*
* @return SecretKey DES密钥
* @throws NoSuchAlgorithmException 当DES算法不可用时抛出
*/
public static SecretKey generateDESKey() throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(56); // DES算法密钥长度为56位,这里每次调用随机都会生成新的密钥。
return keyGenerator.generateKey();
}
/**
* 生成固定DES密钥
*
* @return SecretKey DES密钥
*/
public static SecretKey generateFixDESKey() throws UnsupportedEncodingException {
// 定义一个8字节字符串key
String fixedKey = "qwerasdf";
// 使用固定的字节数组(64位)创建DES密钥
return new SecretKeySpec(fixedKey.getBytes(StandardCharsets.UTF_8), "DES");
}
/**
* 使用DES算法加密
*
* @param data 待加密的数据
* @param secretKey DES密钥
* @return 加密后的数据(Base64编码)
* @throws Exception 加密过程中的异常
*/
public static String encrypt(String data, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedData);
}
/**
* 使用DES算法解密
*
* @param data 加密的数据(Base64编码)
* @param secretKey DES密钥
* @return 解密后的数据
* @throws Exception 解密过程中的异常
*/
public static String decrypt(String data, SecretKey secretKey) throws Exception {
byte[] encryptedData = Base64.getDecoder().decode(data);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
return new String(decryptedData);
}
// 工具类不应该有公共构造器
private DESUtil() {
}
// 主方法用于测试工具类
public static void main(String[] args) {
try {
// 生成DES密钥
SecretKey secretKey = generateFixDESKey();
System.out.println(JSON.toJSONString(secretKey));
// 加密数据
String originalString = "Hello, World!";
String encryptedString = encrypt(originalString, secretKey);
System.out.println("Encrypted: " + encryptedString);
// 解密数据
String decryptedString = decrypt(encryptedString, secretKey);
System.out.println("Decrypted: " + decryptedString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
AES算法
AES(Advanced Encryption Standard)是一种高级加密标准,是目前广泛使用的加密算法之一,提供多种密钥长度(如128位、192位、256位)。
在Java中,可以使用javax.crypto.Cipher类来执行AES加密和解密。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class AESUtil {
// AES算法名称
private static final String AES_ALGORITHM = "AES";
/**
* 生成AES密钥
*
* @return SecretKey AES密钥
* @throws NoSuchAlgorithmException 当AES算法不可用时抛出
*/
public static SecretKey generateAESKey() throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM);
keyGenerator.init(128); // 设置密钥长度为128位
return keyGenerator.generateKey();
}
/**
* 生成AES特定密钥
*
* @return SecretKey AES密钥
* @throws NoSuchAlgorithmException 当AES算法不可用时抛出
*/
public static SecretKey generateFixAESKey() throws NoSuchAlgorithmException {
// 定义一个16字节字符串key
String fixedKey = "qwerasdfzxcvbnml";
// 使用固定的字节数组(128位)创建DES密钥
return new SecretKeySpec(fixedKey.getBytes(StandardCharsets.UTF_8), "AES");
}
/**
* 使用AES算法加密
*
* @param data 待加密的数据
* @param secretKey AES密钥
* @return 加密后的数据(Base64编码)
* @throws Exception 加密过程中的异常
*/
public static String encrypt