首页 > 其他分享 >Spring Boot实现api接口加解密

Spring Boot实现api接口加解密

时间:2024-11-01 10:19:06浏览次数:3  
标签:加密 String Boot Spring 加解密 static encryptedData key import

在Spring Boot应用中实现API接口的加解密,可以确保数据在传输过程中的安全性。通常,我们会使用HTTPS来加密传输层的数据,同时也可以在应用层对数据进行额外的加密和解密。以下是一个基本的实现步骤,包括使用HTTPS和应用层加密。

  1. 使用HTTPS
    HTTPS是HTTP的安全版本,通过SSL/TLS协议对数据进行加密。以下是如何在Spring Boot应用中配置HTTPS的简要步骤:

生成SSL证书
你可以使用工具如keytool生成自签名证书,或者从证书颁发机构(CA)购买证书。

sh
keytool -genkeypair -alias mykey -keyalg RSA -keystore keystore.p12 -storetype PKCS12 -validity 365 -keysize 2048
配置Spring Boot使用HTTPS
在application.properties或application.yml中配置SSL证书路径和密码:

properties

application.properties

server.port=8443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your_keystore_password
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=mykey
或者:

yaml

application.yml

server:
port: 8443
ssl:
key-store: classpath:keystore.p12
key-store-password: your_keystore_password
keyStoreType: PKCS12
keyAlias: mykey
2. 应用层加解密
在应用层,你可以使用对称加密算法(如AES)或非对称加密算法(如RSA)对数据进行加密和解密。以下是一个使用AES加密和解密的示例。

引入依赖
确保你的pom.xml中包含Spring Boot Starter Web依赖:

xml


org.springframework.boot
spring-boot-starter-web



创建加密工具类
java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class EncryptionUtil {

private static final String ALGORITHM = "AES";  
private static final String TRANSFORMATION = "AES";  

// 生成密钥  
public static SecretKey generateKey() throws Exception {  
    KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);  
    keyGen.init(128);  
    return keyGen.generateKey();  
}  

// 加密  
public static String encrypt(String data, SecretKey key) throws Exception {  
    Cipher cipher = Cipher.getInstance(TRANSFORMATION);  
    cipher.init(Cipher.ENCRYPT_MODE, key);  
    byte[] encryptedBytes = cipher.doFinal(data.getBytes());  
    return Base64.getEncoder().encodeToString(encryptedBytes);  
}  

// 解密  
public static String decrypt(String encryptedData, SecretKey key) throws Exception {  
    Cipher cipher = Cipher.getInstance(TRANSFORMATION);  
    cipher.init(Cipher.DECRYPT_MODE, key);  
    byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);  
    byte[] decryptedBytes = cipher.doFinal(decodedBytes);  
    return new String(decryptedBytes);  
}  

// 从字符串生成密钥(用于测试或已知密钥的场景)  
public static SecretKey getSecretKeyFromString(String secretKeyStr) {  
    byte[] decodedKey = Base64.getDecoder().decode(secretKeyStr);  
    return new SecretKeySpec(decodedKey, 0, decodedKey.length, ALGORITHM);  
}  

}
创建控制器
java
import org.springframework.web.bind.annotation.*;

import javax.crypto.SecretKey;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping(“/api”)
public class EncryptionController {

// 假设密钥是硬编码的(实际中应从安全存储中获取)  
private static final String SECRET_KEY_STR = "your_base64_encoded_secret_key";  
private static final SecretKey SECRET_KEY = EncryptionUtil.getSecretKeyFromString(SECRET_KEY_STR);  

@PostMapping("/encrypt")  
public Map<String, String> encryptData(@RequestBody Map<String, String> request) throws Exception {  
    String data = request.get("data");  
    String encryptedData = EncryptionUtil.encrypt(data, SECRET_KEY);  
    Map<String, String> response = new HashMap<>();  
    response.put("encryptedData", encryptedData);  
    return response;  
}  

@PostMapping("/decrypt")  
public Map<String, String> decryptData(@RequestBody Map<String, String> request) throws Exception {  
    String encryptedData = request.get("encryptedData");  
    String decryptedData = EncryptionUtil.decrypt(encryptedData, SECRET_KEY);  
    Map<String, String> response = new HashMap<>();  
    response.put("decryptedData", decryptedData);  
    return response;  
}  

}
3. 测试API
你可以使用Postman或其他API测试工具来测试你的加密和解密API。

加密请求:
URL: POST /api/encrypt
Body: {“data”: “your_plain_text_data”}
解密请求:
URL: POST /api/decrypt
Body: {“encryptedData”: “your_encrypted_data”}
注意事项
密钥管理:不要在生产环境中硬编码密钥。使用安全的密钥管理服务(如AWS KMS、Azure Key Vault等)来管理密钥。
异常处理:在实际应用中,应添加适当的异常处理逻辑,以处理加密和解密过程中可能出现的异常。
性能考虑:加密和解密操作可能会影响性能,特别是在处理大量数据时。

标签:加密,String,Boot,Spring,加解密,static,encryptedData,key,import
From: https://blog.csdn.net/weixin_46105038/article/details/143425382

相关文章