网站首页 > 技术文章 正文
在现代Web应用中,如何确保前后端通信的安全性是非常重要的操作。而加密通信则是一种很有效的保护数据安全性的方法。下面我们就来介绍一下如何在Spring Boot中实现前后端数据加密通信。
为什么需要加密通信?
尽管HTTPS已经对数据传输进行了加密,但在某些情况下,我们仍需要对敏感数据进行额外加密,例如防止中间人攻击解密敏感数据,在某些特定环境中需要对数据进行加密传输,通过与HTTPS的双重加密操作来增加系统的安全性。
基本思路
加密通信的核心流程,在前端发送请求前对敏感数据进行加密操作。后端接收到加密数据后解密并处理。而后端在返回数据的时候对数据进行加密操作,而当前端收到数据之后对数据进行解密操作。而在实际开发中,我们可以选择的加密方式有很多,例如对称加密(AES)、非对称加密(RSA)、或者结合两者的混合加密方式。
下面我们就来看看详细的实现步骤。
使用RSA实现加密通信
RSA是一种非对称加密算法,常用于加密小数据或加密对称密钥。RSA 的核心是公钥和私钥。公钥用于加密,私钥用于解密。可以按照如下的步骤来进行操作。
准备公钥和私钥
生成密钥对可以通过工具(如 OpenSSL 或 Java 的 KeyPairGenerator)完成,如下所示。
# 生成私钥
openssl genpkey -algorithm RSA -out private_key.pem
# 从私钥生成公钥
openssl rsa -pubout -in private_key.pem -out public_key.pem
将生成的密钥放在资源目录src/main/resources/keys/中。
后端代码实现
添加RSA加解密工具类
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.*;
import javax.crypto.Cipher;
import java.util.Base64;
public class RSAUtil {
private static final String RSA = "RSA";
// 加载公钥
public static PublicKey loadPublicKey(String publicKeyStr) throws Exception {
byte[] decoded = Base64.getDecoder().decode(publicKeyStr);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decoded);
return keyFactory.generatePublic(keySpec);
}
// 加载私钥
public static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception {
byte[] decoded = Base64.getDecoder().decode(privateKeyStr);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decoded);
return keyFactory.generatePrivate(keySpec);
}
// 加密
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(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
}
// 解密
public static String decrypt(String data, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance(RSA);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(data));
return new String(decrypted, StandardCharsets.UTF_8);
}
}
Spring Boot接口示例
下面我们就可以在Controller层中实现,加载密钥并实现加解密API操作,如下所示。
@RestController
@RequestMapping("/api/secure")
public class SecureController {
private final PrivateKey privateKey;
private final PublicKey publicKey;
public SecureController() throws Exception {
// 加载密钥
String privateKeyStr = new String(Files.readAllBytes(Paths.get("src/main/resources/keys/private_key.pem")));
String publicKeyStr = new String(Files.readAllBytes(Paths.get("src/main/resources/keys/public_key.pem")));
this.privateKey = RSAUtil.loadPrivateKey(privateKeyStr);
this.publicKey = RSAUtil.loadPublicKey(publicKeyStr);
}
@PostMapping("/decrypt")
public String decryptData(@RequestBody String encryptedData) throws Exception {
return RSAUtil.decrypt(encryptedData, privateKey);
}
@GetMapping("/encrypt")
public String encryptData(@RequestParam String data) throws Exception {
return RSAUtil.encrypt(data, publicKey);
}
}
前端实现加密解密
以JavaScript为例,使用crypto.subtle 或第三方库如node-rsa来实现前端的数据加解密操作,如下所示。
// 使用 Node.js 示例
const NodeRSA = require('node-rsa');
const fs = require('fs');
// 加载公钥
const publicKey = fs.readFileSync('public_key.pem', 'utf8');
// 加密
const key = new NodeRSA(publicKey);
key.setOptions({ encryptionScheme: 'pkcs1' });
const data = "Sensitive data";
const encrypted = key.encrypt(data, 'base64');
console.log("Encrypted:", encrypted);
// 解密(测试时需要私钥)
const privateKey = fs.readFileSync('private_key.pem', 'utf8');
const privateKeyInstance = new NodeRSA(privateKey);
const decrypted = privateKeyInstance.decrypt(encrypted, 'utf8');
console.log("Decrypted:", decrypted);
总结
通过上述步骤,我们就可以在Spring Boot应用中实现安全的前后端加密通信。根据具体需求,选择合适的加密方式,保障数据传输安全。
猜你喜欢
- 2024-12-06 前端常用的数据加密:MD5、SHA、Base64及其实现方式
- 2024-12-06 聊聊前端常见的数据加密
- 2024-12-06 自创一种前端语言,能否替代js,以实现代码加密?
你 发表评论:
欢迎- 07-07使用AI开发招聘网站(100天AI编程实验)
- 07-07Tailwindcss 入门(tailwindcss中文文档)
- 07-07CSS 单位指南(css计量单位)
- 07-07CSS 定位详解(css定位属性的运用)
- 07-07程序员可以作为终身职业吗?什么情况下程序员会开始考虑转行?
- 07-07云和学员有话说:国企转行前端开发,斩获13K高薪!
- 07-0791年转行前端开发,是不是不该转,有啥风险?
- 07-07计算机图形学:变换矩阵(图形学 矩阵变换)
- 595℃几个Oracle空值处理函数 oracle处理null值的函数
- 588℃Oracle分析函数之Lag和Lead()使用
- 575℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 572℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 568℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 561℃【数据统计分析】详解Oracle分组函数之CUBE
- 548℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 541℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- 前端获取当前时间 (50)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)