当处理大型的系统项目,或者保密性要求高的项目。是要解除一些加密算法的,非对称加密肯定比对称加密更加安全,但是也更消耗性能。这里就展示一下前端使用Vue,后端使用Spring boot的情况下,进行前后端交互的情况。

前端

安装加密插件

cnpm install jsencrypt --save

在main.js中全局绑定加密方法,全局设置公匙

import { JSEncrypt } from 'jsencrypt'Vue.prototype.$encryptByPublicKey=function(content) {let encrypt=new JSEncrypt();encrypt.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCH6+puCfJfAWLwIeAqvffe4Hpdr+2W7CI9p5dgsLhtXKvPx+LWAuyTGspwNlQ9DpBTvQEpgnFXkiUGO9DwElJgekAG7Eb3RGN92WQX2BpzvbnZrDYVZT9bTxkNfUABc2zkSG278ndC6e1/gyrkx7rGkLvlHvZwKxy9YPYJL44sBwIDAQAB")return encrypt.encrypt(content);
};

测试代码,加密一个字符串,在新窗口打开,传递到后端

 let data = this.$encryptByPublicKey("14d0b282059a4d52b54deb924cabf9d5");data=encodeURIComponent(data);window.open("http://localhost:18002/ossserver/api/v1/material/file/secret?key="+data);

后端

RSA工具类,加密、解密、生成公匙密匙、签名、验证

package com.grandtech.oss.common;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;public class RSACoder {public static final String KEY_ALGORITHM = "RSA";public static final String SIGNATURE_ALGORITHM = "MD5withRSA";private static final String PUBLIC_KEY = "RSAPublicKey";private static final String PRIVATE_KEY = "RSAPrivateKey";public static byte[] decryptBASE64(String key) {return Base64.decodeBase64(key);}public static String encryptBASE64(byte[] bytes) {return Base64.encodeBase64String(bytes);}/*** 用私钥对信息生成数字签名** @param data       加密数据* @param privateKey 私钥* @return* @throws Exception*/public static String sign(byte[] data, String privateKey) throws Exception {// 解密由base64编码的私钥byte[] keyBytes = decryptBASE64(privateKey);// 构造PKCS8EncodedKeySpec对象PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取私钥匙对象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 用私钥对信息生成数字签名Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(priKey);signature.update(data);return encryptBASE64(signature.sign());}public static PrivateKey strToPrivateKey(String privateKey) throws Exception {// 解密由base64编码的私钥byte[] keyBytes = decryptBASE64(privateKey);// 构造PKCS8EncodedKeySpec对象PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取私钥匙对象return keyFactory.generatePrivate(pkcs8KeySpec);}/*** 校验数字签名** @param data      加密数据* @param publicKey 公钥* @param sign      数字签名* @return 校验成功返回true 失败返回false* @throws Exception*/public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {// 解密由base64编码的公钥byte[] keyBytes = decryptBASE64(publicKey);// 构造X509EncodedKeySpec对象X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取公钥匙对象PublicKey pubKey = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initVerify(pubKey);signature.update(data);// 验证签名是否正常return signature.verify(decryptBASE64(sign));}public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception{// 对密钥解密byte[] keyBytes = decryptBASE64(key);// 取得私钥PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);// 对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 解密<br>* 用私钥解密** @param data* @param key* @return* @throws Exception*/public static byte[] decryptByPrivateKey(String data, String key)throws Exception {return decryptByPrivateKey(decryptBASE64(data),key);}/*** 解密<br>* 用公钥解密** @param data* @param key* @return* @throws Exception*/public static byte[] decryptByPublicKey(byte[] data, String key)throws Exception {// 对密钥解密byte[] keyBytes = decryptBASE64(key);// 取得公钥X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicKey = keyFactory.generatePublic(x509KeySpec);// 对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 加密<br>* 用公钥加密** @param data* @param key* @return* @throws Exception*/public static byte[] encryptByPublicKey(String data, String key)throws Exception {// 对公钥解密byte[] keyBytes = decryptBASE64(key);// 取得公钥X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicKey = keyFactory.generatePublic(x509KeySpec);// 对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data.getBytes());}/*** 加密<br>* 用私钥加密** @param data* @param key* @return* @throws Exception*/public static byte[] encryptByPrivateKey(byte[] data, String key)throws Exception {// 对密钥解密byte[] keyBytes = decryptBASE64(key);// 取得私钥PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);// 对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 取得私钥** @param keyMap* @return* @throws Exception*/public static String getPrivateKey(Map<String, Key> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return encryptBASE64(key.getEncoded());}/*** 取得公钥** @param keyMap* @return* @throws Exception*/public static String getPublicKey(Map<String, Key> keyMap)throws Exception {Key key = keyMap.get(PUBLIC_KEY);return encryptBASE64(key.getEncoded());}/*** 初始化密钥** @return* @throws Exception*/public static Map<String, Key> initKey() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGen.initialize(1024);KeyPair keyPair = keyPairGen.generateKeyPair();Map<String, Key> keyMap = new HashMap(2);keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私钥return keyMap;}}

生成公匙密匙

  @Testpublic void initKey() {try {Map<String, Key> keyMap= RSACoder.initKey();System.out.println(RSACoder.getPrivateKey(keyMap));System.out.println(RSACoder.getPublicKey(keyMap));} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}

接口接收传进来的加密后的参数,并解密

  @GetMapping("/file/secret")private ResponseEntity<Resource> downFiles(HttpServletRequest request, HttpServletResponse response) {String privateKey="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIfr6m4J8l8BYvAh4Cq9997gel2v7ZbsIj2nl2CwuG1cq8/H4tYC7JMaynA2VD0OkFO9ASmCcVeSJQY70PASUmB6QAbsRvdEY33ZZBfYGnO9udmsNhVlP1tPGQ19QAFzbORIbbvyd0Lp7X+DKuTHusaQu+Ue9nArHL1g9gkvjiwHAgMBAAECgYBUBDHOfvuAWl0LzgTApthWvi8lRh/4kFHCBpv9un7lqsjREN9YJkqRy5eisRJ1A1GXUVcsj2L8HGwiZEsMembML7ifPReXVYieXPCOIFuPZWwmlBWh3imeU2YvCrvMjG3wQIIlGpWpqjdPX683DYxUF2wAxSRupZ98lvEctU+1oQJBANKFSUSD8Sz9zXKL9xbn24XHshMvWNIkxONtvyJh8Vf3omFEWPtlw6ekSQSAmOhpk6CLyAq5QMtGdHGWZTA+8K8CQQClSPjyLJSwQHfiMZQ66WrNCWXETOhoT9t10KA2BRVmyFQMrxU0zecmrTORpSKTjRjHAoyfUm6rXbI9QY/2SGApAkEAna0S6WxhcS9Pd6H5mYBjXVnquI/X2N2NUkJazCfLmfVx+6QzeWgJGUDlJ6gh3sFkvvSzCcUjEJ1ejcz1USNzJQJAZJPrKTMHp9kTGomg8dhoLSyyyKkkI5W0rhSt6TFevJTa0H0aIm/JYTe0UcRzLeaGVVOvzqOSxKTXeX8T44JXQQJAdvTiEX9a9mvOC8J3893bENv5pfpCOMQKsjyHeMxoS7wJ6rxwoH0KYNWrycYGmpBEcZUgcz8RQ+oeaLDFicudEw==";String id= null;try {String key=request.getParameter("key");id = new String(RSACoder.decryptByPrivateKey(key,privateKey));} catch (Exception e) {e.printStackTrace();return null;}

正常运行前端代码,后端解密正常

RSA并不适合大量数据的加密

Vue与Spring boot基于RSA非对称加密进行前后端交互相关推荐

  1. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互

    (以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 [cp ...

  2. 【备忘】Spring Boot技术栈博客企业前后端

    第1章 Spring Boot 简介     第2章 开启 Spring Boot 的第一个 Web 项目     第3章 一个Hello World项目     第4章 开发环境的搭建     第5 ...

  3. Spring Boot技术栈博客企业前后端

    视频 链接:https://pan.baidu.com/s/1Ed8tIUyq5QssYcXe7CEisA  提取码:q3dn 源码下载 链接:https://pan.baidu.com/s/1H06 ...

  4. 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密

    学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA  AES  RSA AES  混合加密  整合 前言:    为了提高安全性采用了RSA,但 ...

  5. Spring Boot整合RSA加密数据传输

    简介 吹水时间开始了,是这样的,公司自研开发一个app,因为要运营和上架需要办理安全评估,办理中说到公司app有可能会泄露用户信息,对用户信息没有加密,遇到抓包的可能会导致用户信息泄露,这时我想到了R ...

  6. 基于Python语言、RSA非对称加密的IRC聊天室客户端

    源码地址: (55条消息) 基于Python语言.RSA非对称加密的IRC聊天室客户端源码与应用程序-Python文档类资源-CSDN文库 1 研究背景和现状 IRC是Internet Relay C ...

  7. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  8. Springboot+RSA非对称加密

    这是百度百科对(对称加密丶非对称加密)的解释: (1)对称加密算法在加密和解密时使用的是同一个秘钥. (2)非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称 ...

  9. 加密算法---RSA 非对称加密原理及使用

    加密算法---RSA 非对称加密原理及使用 一 非对称加密原理介绍 二 加密解密测试 2.1 加密解密工具类 2.2 测试 一 非对称加密原理介绍 非对称加密算法中,有两个密钥:公钥和私钥.它们是一对 ...

最新文章

  1. GoogleNet - Going deeper with convolutions
  2. deepin 远程linux,在Deepin Linux操作系统中如何连接Microsoft OneDrive
  3. 张宇概率论与数理统计pdf_【书籍篇】张宇概率论与数理统计9讲
  4. 关于dell - R710的磁盘管理
  5. LightOJ - 1071 Baker Vai(最大费用最大流+拆点)
  6. 快速学习EndNote X7
  7. 长沙4月21日开发者大会暨.NET社区成立大会活动纪实
  8. .Net Core 3.0下AOP试水~~
  9. UITextView自定义placeholder功能:用一个label写了文字,然后当检测到长度不为0的时候就把label隐藏...
  10. matlab调用库函数,Matlab调用函数的详细操作
  11. String a = new String(“abc“); 到底创建了几个对象
  12. android socket 失败,安卓Socket发起失败 急
  13. 大学计算机课程复习--汇编语言
  14. 使用FFmpeg命令对音视频进行基础的编辑
  15. 华硕天选笔记本电脑启动机器后搜索不到网络
  16. K-Means(聚类)
  17. ios 获取相机胶卷_电影胶片相机的工作原理
  18. 四级词汇4000快速记忆
  19. mac下使用diskutil给U盘格式化
  20. svg去掉黑色自带背景图

热门文章

  1. 投资理财启蒙之《小狗钱钱》拆读
  2. 如何用p5js做一个可爱的鲶鲶并添加不倒翁效果
  3. python中用pygame创建一个精致的窗口
  4. Unity3D中 使模型变成变透明
  5. 使用iVMS-4200 存储录像数据时的设置
  6. Windows常用Dos命令详解_被迫流浪者的博客
  7. 应用VBS修改注册表大全
  8. 指针pt的值(pt,pt,*pt)
  9. 2015年6月9日晨_学习
  10. deepin 切换大黄蜂显卡驱动