由于现在类似MD5算法可能可以被彩虹桥破解,数据库存储用户密码的时候有需要使用到加密。所以自己根据AES算法的参照网上文章实现了这么一个工具类。
AES算法
AES (Advanced Encryption Standard) 是一种对称密钥加密算法,广泛应用于信息安全领域。它被认为是目前最常用和最安全的加密算法之一。
介绍
-
对称密钥算法:AES 使用相同的密钥进行加密和解密,因此被归类为对称密钥算法。这意味着发送方和接收方必须在通信前共享密钥。
-
块加密算法:AES 将明文分成固定大小的块(128 比特),然后对每个块进行加密。在加密过程中,每个块使用相同的密钥独立加密,增强了安全性。
-
密钥长度:AES 支持多种密钥长度,包括 128 位、192 位和 256 位。密钥越长,破解难度越大,但同时也增加了计算成本。
-
替代算法:AES 有三种变体,分别使用不同的密钥长度,分别为 AES-128、AES-192 和 AES-256。这些变体之间的区别在于密钥长度和轮数。
-
加密速度:AES 算法在现代计算机上具有良好的性能,加密速度快,适用于大量数据的加密和解密操作。
优缺点分析
ES算法优点
-
安全性高:AES 算法经过广泛的分析和审查,在安全性方面表现良好,被广泛认可为安全可靠的加密算法。
-
性能良好:AES 算法在现代计算机和硬件上具有良好的性能,可以快速加密和解密大量数据。
-
灵活性:AES 支持不同的密钥长度,可以根据需要选择合适的密钥长度来平衡安全性和性能。
-
标准化:AES 是美国政府采用的加密标准,也是国际标准,被广泛应用于各种安全领域。
AES算法缺点
-
密钥管理:由于 AES 是对称密钥算法,发送方和接收方需要共享密钥。因此,密钥的安全存储和分发是一个挑战,特别是在大规模系统中。
-
中间人攻击:如果未能确保密钥的安全性,可能会受到中间人攻击的威胁,导致数据泄露或篡改。
-
硬件资源需求:使用较长的密钥长度(如 256 位)可能会增加加密和解密操作的计算成本,对硬件资源有一定要求。
-
不适合公开密钥加密:AES 是对称密钥算法,不适用于公开密钥加密(PKI)体系结构,这在某些场景下可能限制了其应用范围。
综合来看,AES 算法在安全性、性能和灵活性方面表现优异,是许多应用中首选的加密算法之一。然而,在实际应用中,仍需注意密钥管理和安全实施,以确保其有效性。
代码实现
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.spec.KeySpec;
import java.util.Base64;
public class AESEncryptionUtil {
private static final String AES_ALGORITHM = "AES";
// 在这里设置用于生成密钥的密码和盐
private static final String PASSWORD = "myPassword";
private static final String SALT = "mySalt";
// 从密码和盐生成AES密钥
private static final SecretKey secretKey;
static {
try {
secretKey = generateKey(PASSWORD, SALT);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 使用AES加密算法加密提供的密码。
*/
public static String encrypt(String password) throws Exception {
Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedData);
}
/**
* 使用AES解密算法解密提供的加密密码。
*/
public static String decrypt(String encryptedPassword) throws Exception {
byte[] decodedData = Base64.getDecoder().decode(encryptedPassword);
Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(decodedData);
return new String(decryptedData, StandardCharsets.UTF_8);
}
/**
* 从密码和盐生成AES密钥。
*/
private static SecretKey generateKey(String password, String salt) throws Exception {
// 使用PBKDF2密钥衍生函数生成密钥
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
return new SecretKeySpec(tmp.getEncoded(), AES_ALGORITHM);
}
public static void main(String[] args) throws Exception {
// 模拟登录过程,解密加密的密码
String encrypt = encrypt("123");
System.out.println(encrypt);
String decryptedPassword = decrypt(encrypt);
System.out.println("解密后的密码 : " + decryptedPassword);
}
}