Java网络数据怎么加密
在 Java 中进行网络数据加密,通常分为 传输层加密 和 应用层加密 两大类。下面从常见场景出发,给你一个清晰、实用的总结。
一、最推荐:使用 HTTPS(TLS/SSL)
这是最常见、最安全、最省事的方式。
1️⃣ 原理
- 在传输层对数据进行加密
- 使用 TLS(HTTPS = HTTP + TLS)
- 不需要自己实现加密算法
2️⃣ Java 中的实现方式
✅ 客户端(Java)
URL url = new URL("https://example.com/api");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("GET");
InputStream in = conn.getInputStream();
✅ 服务端(Spring Boot)
server:
port: 8443
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: changeit
key-store-type: PKCS12
✅ 优点
- 自动加密、完整性校验
- 防中间人攻击
- 不需要自己管密钥
✅ 适用场景
- Web API
- 前后端通信
- 微服务间通信
二、Socket 通信加密(SSL/TLS)
如果你用的是 TCP Socket,可以手动启用 TLS。
1️⃣ 服务端
SSLServerSocketFactory factory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket serverSocket =
(SSLServerSocket) factory.createServerSocket(8443);
2️⃣ 客户端
SSLSocketFactory factory =
(SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket =
(SSLSocket) factory.createSocket("localhost", 8443);
✅ 适合
- 自定义协议
- 长连接
- IM、游戏、IoT
三、应用层加密(数据本身加密)
在已经建立连接的基础上,对数据内容加密。
1️⃣ 对称加密(AES,最常用)
适合加密大量数据
加密
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey key = keyGen.generateKey();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal("hello".getBytes(StandardCharsets.UTF_8));
解密
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(encrypted);
✅ 注意
- 密钥不能明文传输
- 通常配合 RSA 或 HTTPS 交换密钥
2️⃣ 非对称加密(RSA)
适合加密小数据(如密钥)
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = keyPairGen.generateKeyPair();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] encrypted = cipher.doFinal("123456".getBytes());
✅ 常见用法
- 用 RSA 加密 AES 密钥
- 用 AES 加密业务数据
四、常见安全组合方案 ✅(推荐)
生产环境标准做法
HTTPS / TLS
↓
AES 加密业务数据
↓
RSA 加密 AES 密钥(可选)
五、JWT / Token 也算“加密”吗?
❌ JWT 默认不是加密,是签名
- 防篡改 ✅
- 不防被看到 ❌
✅ 如果需要加密 JWT:
JWE (JSON Web Encryption)
六、常见错误 ❌
- 自己实现加密算法 ❌
- 明文传输密钥 ❌
- 用 Base64 当作加密 ❌
- 客户端硬编码密钥 ❌
七、如何选择?
| 场景 | 推荐方案 |
|---|---|
| Web API | HTTPS |
| Socket | TLS Socket |
| 数据敏感 | HTTPS + AES |
| 登录密码 | HTTPS + 后端 Hash |
| 微服务 | mTLS |
如果你愿意,可以告诉我:
- ✅ 是 HTTP / Socket / WebSocket?
- ✅ 是 客户端-服务器 / 服务-服务?
- ✅ 数据敏感级别?
我可以直接给你 可运行的完整示例代码。