在Java中,API接口数据传输加密需结合传输层加密(如HTTPS)与应用层加密(如对称/非对称加密),确保数据在传输过程中的机密性、完整性与身份验证。以下是具体实现方案:
HTTPS是API接口加密的基础,通过SSL/TLS协议建立加密通道,防止数据被窃取或篡改。Java中可通过HttpsURLConnection或第三方库(如Apache HttpClient)实现。
若服务端使用自签名证书,需自定义TrustManager信任该证书,避免连接被拒绝:
import javax.net.ssl.*;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
public class SSLUtil {
public static SSLContext createTrustAllSSLContext() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
public void checkClientTrusted(X509Certificate[] certs, String authType) {}
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}}, new java.security.SecureRandom());
return sslContext;
}
}
使用Java 11+的HttpClient发送HTTPS请求,配置SSL上下文:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import javax.net.ssl.SSLContext;
public class HttpsClientExample {
public static void main(String[] args) throws Exception {
SSLContext sslContext = SSLUtil.createTrustAllSSLContext();
HttpClient client = HttpClient.newBuilder()
.sslContext(sslContext)
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/api"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{\"data\":\"secret\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response: " + response.body());
}
}
注:生产环境中应使用CA颁发的证书,避免信任所有证书的安全风险。
对称加密(如AES)适用于加密大量数据,加密解密使用同一密钥,效率高。Java中通过javax.crypto包实现。
使用KeyGenerator生成128位(推荐)或256位密钥:
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
public class AESKeyGenerator {
public static SecretKey generateKey() throws NoSuchAlgorithmException {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 可选192、256位
return keyGen.generateKey();
}
}
使用Cipher类实现加密(ECB模式需填充,CBC模式需IV):
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESUtil {
private static final String ALGORITHM = "AES/ECB/PKCS5Padding"; // 推荐CBC模式
public static String encrypt(String data, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
public static String decrypt(String encryptedData, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decoded = Base64.getDecoder().decode(encryptedData);
byte[] decrypted = cipher.doFinal(decoded);
return new String(decrypted);
}
}
注:ECB模式安全性较低,推荐使用CBC模式(需生成随机IV并通过Base64传递)。
非对称加密(如RSA)适用于密钥交换或数字签名,安全性更高但效率较低。Java中通过KeyPairGenerator生成密钥对。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
public class RSAKeyGenerator {
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048); // 密钥长度推荐2048位及以上
return keyPairGen.generateKeyPair();
}
}
使用公钥加密、私钥解密:
import javax.crypto.Cipher;
import java.security.PublicKey;
import java.security.PrivateKey;
public class RSAUtil {
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decoded = Base64.getDecoder().decode(encryptedData);
byte[] decrypted = cipher.doFinal(decoded);
return new String(decrypted);
}
}
注:RSA加密数据长度有限(取决于密钥长度),若数据较大需结合AES加密(用RSA加密AES密钥)。
数字签名用于验证数据未被篡改,常用算法为SHA256withRSA(RSA+SHA-256哈希)。
import java.security.PrivateKey;
import java.security.Signature;
public class DigitalSignatureUtil {
public static String sign(String data, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data.getBytes());
byte[] signed = signature.sign();
return Base64.getEncoder().encodeToString(signed);
}
}
import java.security.PublicKey;
import java.security.Signature;
public class DigitalSignatureVerifier {
public static boolean verify(String data, String signatureBase64, PublicKey publicKey) throws Exception {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(data.getBytes());
byte[] signatureBytes = Base64.getDecoder().decode(signatureBase64);
return signature.verify(signatureBytes);
}
}
注:数字签名需与加密结合使用(如先签名再加密),确保数据的完整性与来源可信。
通过以上方案组合,可实现Java API接口数据传输的全链路加密,确保数据安全。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。