- 对称加密:加解密使用同一个密钥,也叫共享密钥加密算法。
- 算法较为简单,性能高
- 非对称加密:加密和解密使用不同的密钥的算法,也叫公开密钥加密算法。这两个密钥互不相同,一个称为公钥,另一个称为私钥。公钥可以公开给任何人使用,私钥则要保密。
- 算法较为复杂,性能低
- 公钥加密,私钥解密。这个目的是为了保证内容传输的安全,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容;
- 私钥加密,公钥解密。这个目的是为了保证消息不会被冒充,因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的。
如果用公钥加密数据,只能用对应的私钥解密(加密);如果用私钥加密数据,只能用对应的公钥解密(签名)。这样就可以实现数据的安全传输和身份认证。
- 哈希(摘要)算法:对任意长度数据生成固定程度的哈希值。
- 不可逆,同样验证数据完整性和一致性
- 有加密哈希算法和非加密的,加密的需要消耗性能。
- SHA-256、Bcrypt等是常见的加密算法
- 加盐:在密码任意固定位置插入特定的字符串,让哈希后的结果和使用原始密码的哈希结果不相符。
基于 Java 实现 AES 算法代码示例:
点击查看完整代码实现
java
private static final String AES_ALGORITHM = "AES";
// AES密钥
private static final String AES_SECRET_KEY = "4128D9CDAC7E2F82951CBAF7FDFE675B";
// AES加密模式为GCM,填充方式为NoPadding
// AES-GCM 是流加密(Stream cipher)算法,所以对应的填充模式为 NoPadding,即无需填充。
private static final String AES_TRANSFORMATION = "AES/GCM/NoPadding";
// 加密器
private static Cipher encryptionCipher;
// 解密器
private static Cipher decryptionCipher;
/**
* 完成一些初始化工作
*/
public static void init() throws Exception {
// 将AES密钥转换为SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(AES_SECRET_KEY.getBytes(), AES_ALGORITHM);
// 使用指定的AES加密模式和填充方式获取对应的加密器并初始化
encryptionCipher = Cipher.getInstance(AES_TRANSFORMATION);
encryptionCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
// 使用指定的AES加密模式和填充方式获取对应的解密器并初始化
decryptionCipher = Cipher.getInstance(AES_TRANSFORMATION);
decryptionCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new GCMParameterSpec(128, encryptionCipher.getIV()));
}
/**
* 加密
*/
public static String encrypt(String data) throws Exception {
byte[] dataInBytes = data.getBytes();
// 加密数据
byte[] encryptedBytes = encryptionCipher.doFinal(dataInBytes);
return Base64.getEncoder().encodeToString(encryptedBytes);
}
/**
* 解密
*/
public static String decrypt(String encryptedData) throws Exception {
byte[] dataInBytes = Base64.getDecoder().decode(encryptedData);
// 解密数据
byte[] decryptedBytes = decryptionCipher.doFinal(dataInBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
public static void main(String[] args) throws Exception {
String originalString = "Java学习 + 面试指南:javaguide.cn";
init();
String encryptedData = encrypt(originalString);
String decryptedData = decrypt(encryptedData);
System.out.println("Original String: " + originalString);
System.out.println("AES Encrypted Data : " + encryptedData);
System.out.println("AES Decrypted Data : " + decryptedData);
}输出:
bash
Original String: Java学习 + 面试指南:javaguide.cn
AES Encrypted Data : E1qTkK91suBqToag7WCyoFP9uK5hR1nSfM6p+oBlYj71bFiIVnk5TsQRT+zpjv8stha7oyKi3jQ=
AES Decrypted Data : Java学习 + 面试指南:javaguide.cn点击查看完整代码实现
点击查看完整代码实现
java
private static final String RSA_ALGORITHM = "RSA";
/**
* 生成RSA密钥对
*/
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);
// 密钥大小为2048位
keyPairGenerator.initialize(2048);
return keyPairGenerator.generateKeyPair();
}
/**
* 使用公钥加密数据
*/
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedData);
}
/**
* 使用私钥解密数据
*/
public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
byte[] decodedData = Base64.getDecoder().decode(encryptedData);
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(decodedData);
return new String(decryptedData, StandardCharsets.UTF_8);
}
public static void main(String[] args) throws Exception {
KeyPair keyPair = generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
String originalString = "Java学习 + 面试指南:javaguide.cn";
String encryptedData = encrypt(originalString, publicKey);
String decryptedData = decrypt(encryptedData, privateKey);
System.out.println("Original String: " + originalString);
System.out.println("RSA Encrypted Data : " + encryptedData);
System.out.println("RSA Decrypted Data : " + decryptedData);
}:::
输出:
bash
Original String: Java学习 + 面试指南:javaguide.cn
RSA Encrypted Data : T9ey/CEPUAhZm4UJjuVNIg8RPd1fQ32S9w6+rvOKxmuMumkJY2daFfWuCn8A73Mk5bL6TigOJI0GHfKOt/W2x968qLM3pBGCcPX17n4pR43f32IIIz9iPdgF/INOqDxP5ZAtCDvTiuzcSgDHXqiBSK5TDjtj7xoGjfudYAXICa8pWitnqDgJYoo2J0F8mKzxoi8D8eLE455MEx8ZT1s7FUD/z7/H8CfShLRbO9zq/zFI06TXn123ufg+F4lDaq/5jaIxGVEUB/NFeX4N6OZCFHtAV32mw71BYUadzI9TgvkkUr1rSKmQ0icNhnRdKedJokGUh8g9QQ768KERu92Ibg==
RSA Decrypted Data : Java学习 + 面试指南:javaguide.cn