在Java开发中,加密技术主要涉及到对称加密、非对称加密、散列函数(哈希)。下面和我一起了解这些加密方法,包括它们的优缺点、使用场景,并提供一些常用的Java加密工具类示例。
1、对称加密
对称加密使用同一密钥进行加密和解密。这意味着发送者和接收者必须共享同一个密钥。
常见对称算法
DES (Data Encryption Standard):较旧的标准,不再推荐用于新应用。
3DES (Triple DES):改进版的DES,提高了安全性。
AES (Advanced Encryption Standard):现代标准,广泛使用,安全性高。
优缺点
优点:速度快,适用于大量数据的加密。
缺点: 密钥管理复杂,因为密钥必须安全地分发。
使用场景
用于数据传输加密,如文件加密、数据库字段加密等。
示例
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class SymmetricEncryptionUtil {
private static final String ALGORITHM = "AES";
private static final byte[] keyBytes = new byte[]{/* 你的密钥字节 */};
public static String encrypt(String data) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
public static String decrypt(String encrypted) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decodedValue = Base64.getDecoder().decode(encrypted);
byte[] decrypted = cipher.doFinal(decodedValue);
return new String(decrypted);
}
}
2、非对称加密
非对称加密使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密。这解决了对称加密中密钥分发的问题,但速度相对较慢。
常见非对称算法
RSA:最知名的非对称加密算法。
DSA (Digital Signature Algorithm):主要用于数字签名。
优缺点
优点:密钥分发安全,适合远程密钥交换。
缺点:加密解密速度慢,不适合大数据量加密。
使用场景
用于公钥基础设施(PKI),如SSL/TLS协议中的证书签名和验证。
示例
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import javax.crypto.Cipher;
public class AsymmetricEncryptionUtil {
public static void main(String[] args) throws Exception {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
// 加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] encrypted = cipher.doFinal("Hello, World!".getBytes());
// 解密
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println(new String(decrypted));
}
}
3、散列函数
散列函数将任意长度的数据转换为固定长度的摘要,通常用于验证数据完整性或创建密码的哈希值。
常见散列算法
MD5:由于已知的安全漏洞,不再推荐。
SHA-1:曾广泛使用,但现在认为不够安全。
SHA-256, SHA-384, SHA-512:现代安全散列算法。
优缺点:
优点:用于验证数据完整性和用户密码存储,不可逆。
缺点:无法恢复原始数据。
使用场景
用户密码存储,文件校验,数字签名等。
示例
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;
import java.math.BigInteger;
public class HashUtil {
public static String sha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
BigInteger number = new BigInteger(1, hash);
StringBuilder hexString = new StringBuilder(number.toString(16));
while (hexString.length() < 64) {
hexString.insert(0, '0');
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}