1、创建js文件Encryption.js

/*** 加密解密*//** RSA加密用 生成key */
function bodyRSA(){/** 1024位的key参数写130,2014位的key参数写260 */setMaxDigits(130);/** ajax 调用后台方法,取回公钥 */var keyR ;$.ajax({url: "/GHGL/Key/pk",//请求后台的url,本例是springMVC框架type: "post",cache: false,async : false,dataType: "text",success: function (data){keyR = data;},error:function (XMLHttpRequest, textStatus, errorThrown) {      alert("与服务器连接失败!");}});/** RSAKeyPair 函数三个参数:加密指数、解密指数、系数 */return new RSAKeyPair("10001","",keyR);
}/** AES加密用 随机生成key和iv */
function randomString() {var chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';var length= chars.length;var pwd='';for(var i = 0; i < 16 ;i++){pwd += chars.charAt(Math.floor(Math.random() * length));}return pwd;
}
/*** AES加密* @param data* @param key* @param iv* @returns*/
function getAesString(data,key,iv){var key  = CryptoJS.enc.Utf8.parse(key);var iv   = CryptoJS.enc.Utf8.parse(iv);var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});return encrypted.toString();
}
/*** AES解密* @param encrypted* @param key* @param iv* @returns*/
function getDAesString(encrypted,key,iv){var key  = CryptoJS.enc.Utf8.parse(key);var iv   = CryptoJS.enc.Utf8.parse(iv);var decrypted = CryptoJS.AES.decrypt(encrypted,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});return decodeURIComponent(decrypted.toString(CryptoJS.enc.Utf8)).replace("+", " ");
}

2、ajax请求后台的java类(1)

package com.djzh.basicdata.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.djzh.common.utils.EncryptionDecryption;/*** 获取RSA密钥文件中的公钥* @author       : hanlin* @date         : 2017年2月3日 下午3:32:31* @version      : 1.0*/@Controller
@RequestMapping("/Key")
public class PublicKeyController {/*** 获取RSA密钥文件中的公钥* @return String类型*/@RequestMapping("/pk")@ResponseBody public String getPublicKey(){/** 实例化加密解密工具类*/EncryptionDecryption ed = new EncryptionDecryption();return ed.getPublicKey();}
}

3、ajax请求后台的java类(2)--rea加解密的工具类

EncryptionDecryption.javapackage com.djzh.common.utils;import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.SecureRandom;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;/*** rsa aes 加密解密工具类* Title: EncryptionDecryption* Company: djzh* @author hanlin* @date 2017年1月17日 上午11:02:50*/public class EncryptionDecryption {/** 密钥文件存储位置 */private static String RSAKeyStore = "C:/RSAKey.txt";//在这个位置放这个文件/*** 日志记录器*/public static Logger logger = Logger.getLogger(EncryptionDecryption.class);/*** AES加密* @param content  明文* @param keyBytes 秘钥* @param iv      偏移量* @return   */   public static String AES_CBC_Encrypt(String content, byte[] keyBytes, byte[] iv){  try{ SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");  cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));  content = URLEncoder.encode(content,"UTF-8");   //用url编码byte[] result=cipher.doFinal(content.getBytes()); //加密return new String(Base64.encodeBase64(result),"UTF-8");}catch (NoSuchPaddingException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();} return null;}/*** AES解密* @param content   密文* @param keyBytes  秘钥* @param iv        偏移量* @return          */public static String AES_CBC_Decrypt(String content, byte[] keyBytes, byte[] iv){  try{  content = content.replaceAll(" ", "+");byte[] decryptBaseData=Base64.decodeBase64(content.getBytes("utf-8"));SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");  cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));  byte[] result=cipher.doFinal(decryptBaseData);  return URLDecoder.decode(new String(result),"utf-8");  } catch (NoSuchPaddingException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();}   return null;  }/*** 字符串转为 byte[]* @param hexString* @return*/public static byte[] hexStringToBytes(String hexString) {if (hexString == null || hexString.equals("")) {return null;}hexString = hexString.toUpperCase();int length = hexString.length() / 2;char[] hexChars = hexString.toCharArray();byte[] d = new byte[length];for (int i = 0; i < length; i++) {int pos = i * 2;d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));}return d;}/*** Convert char to byte* @param c char* @return byte*/private static byte charToByte(char c) {return (byte) "0123456789ABCDEF".indexOf(c);}/*** 解密由RSA加密的AES的key 和 iv* @param para* @return* @throws Exception*/public static byte[] getValue(String param) throws Exception{byte[] trueValue = null;try {if(!param.equals("") && param != null){byte[] KeyB = hexStringToBytes(param);KeyB = decrypt(getKeyPair().getPrivate(),KeyB);StringBuffer sbKey = new StringBuffer();sbKey.append(new String(KeyB));param = sbKey.reverse().toString();trueValue = URLDecoder.decode(param,"UTF-8").getBytes(); }           } catch (Exception e) {//重要参数值logger.error("传入参数:" + "param: " + param);//异常说明logger.error("解密由RSA加密的AES的key 和 iv 失败,可能前台传入的aKey或者aIv为空");e.printStackTrace();}return trueValue; }/*** 获取密钥文件中的公钥* @return*/public String getPublicKey(){Object publicKey = null;String publicKEY = null;try {publicKey = getKeyPair().getPublic();publicKEY = (String) publicKey.toString().subSequence(37, 293);} catch (Exception e) {e.printStackTrace();}return publicKEY;      }/*** RSA 生成密钥对* @return* @throws Exception*/public static KeyPair generateKeyPair() throws Exception {try {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());final int KEY_SIZE = 1024;keyPairGen.initialize(KEY_SIZE, new SecureRandom());KeyPair keyPair = keyPairGen.generateKeyPair();FileOutputStream fos = new FileOutputStream(RSAKeyStore);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(keyPair);oos.close();fos.close();return keyPair;} catch (Exception e) {throw new Exception(e.getMessage());}}/*** 获取密钥对* @return* @throws Exception*/public static KeyPair getKeyPair() throws Exception {FileInputStream fis = new FileInputStream(RSAKeyStore);ObjectInputStream oos = new ObjectInputStream(fis);KeyPair kp = (KeyPair) oos.readObject();oos.close();fis.close();return kp;}/*** 解密* @param pk* @param raw* @return* @throws Exception*/@SuppressWarnings("static-access")private static byte[] decrypt(PrivateKey pk, byte[] raw) throws Exception {try {Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());cipher.init(cipher.DECRYPT_MODE, pk);int blockSize = cipher.getBlockSize();ByteArrayOutputStream bout = new ByteArrayOutputStream(64);int j = 0;while (raw.length - j * blockSize > 0) {bout.write(cipher.doFinal(raw, j * blockSize, blockSize));j++;}return bout.toByteArray();} catch (Exception e) {throw new Exception(e.getMessage());}}
}

在某个盘的位置放这个文件,上面代码里调用了。见附件

C:/RSAKey.txt

5、在JSP页面导入Encryption.js,通过ajax进行加密请求

function dataAjaxRefer(){//筛选条件的参数进行加密var keyRSA = bodyRSA(); //生成RSA加密用的keyvar key  = randomString();//随机生成AES的key 和 iv       var iv   = randomString();var aKey = encryptedString(keyRSA, encodeURIComponent(key)); //RSA加密AES的keyvar aIv = encryptedString(keyRSA, encodeURIComponent(iv)); //RSA加密AES的ivvar select1=$("#jffpqh").val();//参数1var selectText1_ = getAesString(encodeURIComponent(select1),key,iv); //AES参数内容1//筛选条件的参数var data={jffpqh:selectText1_, //参数1aKey:aKey, aIv:aIv}//console.log(data)$.ajax({type:"post",url:"/GHGL/Distribution/showFundsTerm",//请求的url,本例为springMVC框架async:true,data:data,dataType:"json",success:function(data){var decryptedStr = getDAesString(data,key,iv);//解密}              },error: function(XMLHttpRequest, textStatus, errorThrown) {alert(XMLHttpRequest.status);alert(XMLHttpRequest.readyState);alert(textStatus);},complete: function(XMLHttpRequest, textStatus) {this; // 调用本次AJAX请求时传递的options参数}});
}

6、总结: 首先创建js文件,里面包含生成加密解密的 key 和iv、加密方法、机密方法,然后在后台写好相应的生成key,IV的工具类,工具类会读取 rsa.txt文件,然后通过js调用ajax进行加密查询,这是项目中用到的,所以给大家分享一下,希望能给大家提供帮助。

附件:链接: https://pan.baidu.com/s/1vIIIW9OZIpFCDM0pyVwK5Q 提取码: ufgu 复制这段内容后打开百度网盘手机App,操作更方便哦

AJAX+REA实现前后台数据交互的加密解密相关推荐

  1. pycharm+python+bootstrap写一个登陆界面_Python--day56(前后台数据交互、bootstrap)

    1. 前后台数据交互 1.1 socket搭建后台 [注意点]: 1. 前台发送的数据是用\r\n进行换行 2. 路由:请求的路径,获得路由的途径是通过后台对前台发送的数据进行拆分(split)得到, ...

  2. Vue前后台数据交互实例演示,使用axios传递json字符串、数组

    Vue 前后台数据交互实例演示 第一章:后台实现 ① Python 启用 Flask 服务器 ② 后台启用成功验证 第二章:前台实现 ① Vue 使用 Axios 实现接收 json 字符串.数组数据 ...

  3. ASP.Net中关于WebAPI与Ajax进行跨域数据交互时Cookies数据的传递

    本文主要介绍了ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据传递的相关知识.具有很好的参考价值.下面跟着小编一起来看下吧 前言 最近公司项目进行架构调整,由原来的三层架构改 ...

  4. ajax与后台php,怎么在thinkPHP5中使用ajax实现与后台数据交互

    怎么在thinkPHP5中使用ajax实现与后台数据交互 发布时间:2021-03-20 17:20:01 来源:亿速云 阅读:87 作者:Leah 这篇文章给大家介绍怎么在thinkPHP5中使用a ...

  5. ajax实现前后端数据交互

    ajax实现前后端数据交互 1.在做项目的时候,或多或少都会用到ajax来实现前后端数据的交互,接下来我们就看一个简单的实例吧. 实例效果: 点击按钮,发送异步请求,请求后端的数据,显示在网页上. 接 ...

  6. easy-table-vue+Vue、SpringBoot+Mybatis实现MVVM模型前后台数据交互

    原文链接:https://www.cnblogs.com/wlovet/p/10980579.html 根据原贴在搭建过程中出现的问题,我在该博客https://blog.csdn.net/Sun_o ...

  7. easy-table-vue+VueJs、SpringBoot+Mybatis实现MVVM模型前后台数据交互

    该项目分为前端展示部分和后台服务部分. 前端部分 使用的技术是:NodeJs.Webpack.VueJs 使用的组件库是:IVIEW.easy-table-vue 使用的开发工具是:WebStorm ...

  8. 前端 Vue 请求数据使用 3DES 加密/解密

    一.目的 最近工作中,前端联调后端接口请求的数据是 JSON 格式的明文,考虑到安全问题,与后端同事沟通协调后,规定前端采用 3DES 对请求数据加密,后端接收到请求后再用 3DES 进行解密. 二. ...

  9. openssl与cryptoAPI交互AES加密解密

    原文: http://blog.csdn.net/zhouyuqwert/article/details/7422467 有读者指出代码贴两遍,修改下. 继上次只有CryptoAPI的加密后,这次要实 ...

最新文章

  1. 分词器 keras.preprocessing.text.Tokenizer
  2. 触摸屏中文软件_八招轻松搞定西门子软件安装!
  3. 国内外NLP领域学术界和工业界的牛人和团队
  4. 1. redis简介
  5. 百度地图infowindow的close事件_高德地图,百度地图,腾讯地图哪个更准?
  6. SSM配置后可以访问静态html文件但无法访问其他后台接口的解决方案
  7. 民族融合 —— 魏晋南北朝
  8. LeetCode 220_Contains Duplicate III
  9. chrome插件开发入门-保姆级攻略
  10. PRAM模型与Amdahl定律
  11. 小米手机 Toast显示带应用名称问题解决方法
  12. 山东理工ACM【1239】水仙花数
  13. arm-2d库详细介绍
  14. Babel转码器(ES6)
  15. windows8 应用小技巧(41-45)
  16. [Realtek sdk3.4.14b] RTL8197FH-VG设备启动之后,2.4G WiFi始终工作在20M 11g模式问题处理
  17. 【动画图解微积分笔记】 (一) -1.概述 (附B站视频)
  18. CSS最后一行:控制寡妇和孤儿
  19. iTop-4412 裸机程序(十七)- 按键介绍
  20. php商城系统有什么优势?php商城系统具备的优势点介绍

热门文章

  1. 本地html文件的打开方法
  2. 分页的自由点击和一整页的翻越
  3. 计算机室内设计绘图论文,分析设计手绘图对室内设计师的作用研究
  4. C++三只小猪称体重案例
  5. springBOOT集成阿里云MQ-AMQP
  6. 自由 Pascal 集成开发环境 Lazarus
  7. 六间房 繁星 酷我 来疯 秀吧 新浪秀 直播播放器 Live 1.2
  8. 使用jQuery加DIV实现可以动态添加的金字塔结构
  9. CAD/CASS断面偏距高程高差批量标注插件(可自动避让、横向或纵向标注)
  10. 带你去华强北拼装小米手机