前后端分离,RSA加密传输方案

2024-02-02 11:04
文章标签 分离 rsa 方案 加密传输

本文主要是介绍前后端分离,RSA加密传输方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.原理

RSA是一种非对称加密算法。通过生成密钥对,用公钥加密,用私钥解密。对于前后端分离的项目,让前端获取到公钥对敏感数据加密,发送到后端,后端用私钥对加密后的数据进行解密即可。

2.实现

RSA工具类:提供秘钥对生成、公钥获取、私钥解密的方法。

public class RSAUtil {private final static Logger logger = LoggerFactory.getLogger(RSAUtil.class);private static final String RSA = "RSA";  private static final int KEY_SIZE = 2048; private static ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // Bouncy Castle加密库提供的一个类,用于为Java提供加密服务private static final BouncyCastleProvider BOUNCY_CASTLE_PROVIDER = new BouncyCastleProvider();// 密钥对生成static void createKey() throws Exception{KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA, BOUNCY_CASTLE_PROVIDER);keyPairGenerator.initialize(KEY_SIZE, new SecureRandom());ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(keyPairGenerator.generateKeyPair());objectOutputStream.close();}// 公钥获取public static RSAPublicKey getPublicKey() throws Exception{return (RSAPublicKey) getKeyPair().getPublic();}// 读取,有密钥对则获取公钥,无密钥对则创建密钥对再获取公钥static KeyPair getKeyPair()throws Exception{if(byteArrayOutputStream.size() == 0){synchronized (byteArrayOutputStream) {createKey();}}ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());  ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);  KeyPair keyPair= (KeyPair) objectInputStream.readObject();  objectInputStream.close();  byteArrayInputStream.close();  return keyPair;  }static byte[] decryptByPrivateKey(byte[] encrypttext){try {Cipher ci = Cipher.getInstance(RSA, BOUNCY_CASTLE_PROVIDER);ci.init(Cipher.DECRYPT_MODE, getKeyPair().getPrivate());return ci.doFinal(encrypttext);}  catch (Exception e) {logger.error(e.getMessage(), e);}return null;}// 接收一个String类型,私钥解密public static String decodeString(String string){try {  byte[] input = Base64.getDecoder().decode(string); // 解码Base64字符串为字节数组  byte[] raw = decryptByPrivateKey(input); // 使用私钥解密数据  return new String(raw, StandardCharsets.UTF_8); // 直接将字节数组转换为UTF-8字符串  } catch (Exception e) {  logger.error("解析失败", e);  return "";  }} }

为前端提供一个获取公钥的接口

@GetMapping("getRSAPublickey")
public Result<?> getRSAPublickey() {Map key = new HashMap();try {// 通过提供模数和公共指数,可以间接地提供公钥,同时保持安全性。String modulus = RSAUtil.getPublicKey().getModulus().toString(16);String publicExponent = RSAUtil.getPublicKey().getPublicExponent().toString(16);key.put("m", modulus);key.put("e", publicExponent);} catch (Exception e) {}return Result.ok(key);
}

前端需要导入一个适合前端使用的RSA加密库。利用获取到的模数和公共指数创建RSA公钥对象,对敏感数据加密。

<html><script src="rsa.js"></script><body><script>window.encryptStr = function (m, e, str) {var rsa = new RSAKey()rsa.setPublic(m, e)return rsa.encrypt(str)}</script></body>
</html>

后端接收到前端利用RSA加密后的字符串后,直接调用RSAUtil进行解密,得到原文。

String password = RSAUtil.decodeString(pram.getPassword());

需要注意的是,前端加密只是数据传输过程中的一部分安全措施。为了确保数据的安全性,还需要在后端服务器进行相应的安全措施,例如验证用户身份、使用HTTPS协议进行通信等。

这篇关于前后端分离,RSA加密传输方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670497

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig