为什么我们需要加密通信
你有没有想过,当你在手机上给朋友发消息,或者在网上购物输入银行卡信息时,这些数据是怎么不被别人偷看的?其实背后有一套叫做“加密”的技术在默默保护你。比如你在咖啡馆连Wi-Fi,黑客可能就在旁边监听网络流量,如果没有加密,你的密码和聊天记录就等于裸奔。
常见加密方式简介
实现安全通信,最常用的有两种加密方式:对称加密和非对称加密。对称加密就像你和朋友共用一把钥匙,加密和解密都用它,速度快但传钥匙容易被截获。非对称加密则有一对钥匙——公钥和私钥,公钥可以公开,用来加密,私钥自己留着,用来解密。别人用你的公钥加密的消息,只有你用自己的私钥才能打开。
AES 对称加密实战
我们先来看一个实际例子:使用 AES 算法进行对称加密。AES 是目前最常用的对称加密标准,广泛用于 HTTPS、文件加密等场景。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class AESEncryption {
public static void main(String[] args) throws Exception {
// 生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 使用128位密钥
SecretKey secretKey = keyGen.generateKey();
// 创建加密实例
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 要加密的数据
String originalData = "这是一条敏感信息";
byte[] encryptedData = cipher.doFinal(originalData.getBytes());
// 输出加密结果(Base64编码便于查看)
System.out.println("加密后: " + Base64.getEncoder().encodeToString(encryptedData));
// 解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
System.out.println("解密后: " + new String(decryptedData));
}
}
RSA 非对称加密示例
再来看看 RSA,它是典型的非对称加密算法。适合用来安全地传递对称加密的密钥。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
import java.util.Base64;
public class RSAEncryption {
public static void main(String[] args) throws Exception {
// 生成密钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 要加密的数据
String data = "这是需要保密的内容";
// 加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = cipher.doFinal(data.getBytes());
System.out.println("加密后: " + Base64.getEncoder().encodeToString(encryptedData));
// 解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
System.out.println("解密后: " + new String(decryptedData));
}
}
实际应用中的组合策略
在真实世界中,比如 HTTPS 协议,并不会只用一种加密方式。通常会先用 RSA 交换一个临时的 AES 密钥,之后的通信都用 AES 加密。这样既保证了安全性,又兼顾了性能。想象一下,你去银行取钱,先通过人脸识别确认身份(类似RSA),然后拿到一个临时门禁卡进入金库(类似AES),整个过程更高效也更安全。
注意事项与常见坑
写代码时要注意,密钥不能硬编码在代码里,否则一旦泄露全完了。应该使用密钥管理服务或配置文件隔离。另外,初始化向量(IV)在 AES 中也很重要,每次加密最好随机生成,避免重复使用导致被破解。还有,不要自己造轮子去实现核心算法,一定要用经过验证的库,比如 Java 的 JCE 或 Python 的 cryptography。”}