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

前端之家收集整理的这篇文章主要介绍了AJAX+REA实现前后台数据交互的加密解密前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

1、创建js文件Encryption.js

  1. /**
  2. *加密解密
  3. */
  4.  
  5. /**RSA加密用生成key*/
  6. functionbodyRSA(){
  7. /**1024位的key参数写130,2014位的key参数写260*/
  8. setMaxDigits(130);
  9. /**ajax调用后台方法,取回公钥*/
  10. varkeyR;
  11. $.ajax({
  12. url:"/GHGL/Key/pk",//请求后台的url,本例是springMVC框架
  13. type:"post",cache:false,async:false,dataType:"text",success:function(data)
  14. {
  15. keyR=data;
  16. },error:function(XMLHttpRequest,textStatus,errorThrown){
  17. alert("与服务器连接失败!");
  18. }
  19. });
  20. /**RSAKeyPair函数三个参数:加密指数、解密指数、系数*/
  21. returnnewRSAKeyPair("10001","",keyR);
  22. }
  23.  
  24. /**AES加密用随机生成key和iv*/
  25. functionrandomString(){
  26. varchars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  27. varlength=chars.length;
  28. varpwd='';
  29. for(vari=0;i<16;i++){
  30. pwd+=chars.charAt(Math.floor(Math.random()*length));
  31. }
  32. returnpwd;
  33. }
  34. /**
  35. *AES加密
  36. *@paramdata
  37. *@paramkey
  38. *@paramiv
  39. *@returns
  40. */
  41. functiongetAesString(data,key,iv){
  42. varkey=CryptoJS.enc.Utf8.parse(key);
  43. variv=CryptoJS.enc.Utf8.parse(iv);
  44. varencrypted=CryptoJS.AES.encrypt(data,{
  45. iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7
  46. });
  47. returnencrypted.toString();
  48. }
  49. /**
  50. *AES解密
  51. *@paramencrypted
  52. *@paramkey
  53. *@paramiv
  54. *@returns
  55. */
  56. functiongetDAesString(encrypted,iv){
  57. varkey=CryptoJS.enc.Utf8.parse(key);
  58. variv=CryptoJS.enc.Utf8.parse(iv);
  59. vardecrypted=CryptoJS.AES.decrypt(encrypted,padding:CryptoJS.pad.Pkcs7
  60. });
  61. returndecodeURIComponent(decrypted.toString(CryptoJS.enc.Utf8)).replace("+","");
  62. }

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

  1. packagecom.djzh.basicdata.controller;
  2.  
  3. importorg.springframework.stereotype.Controller;
  4. importorg.springframework.web.bind.annotation.RequestMapping;
  5. importorg.springframework.web.bind.annotation.ResponseBody;
  6.  
  7. importcom.djzh.common.utils.EncryptionDecryption;
  8.  
  9. /**
  10. *获取RSA密钥文件中的公钥
  11. *@author:hanlin
  12. *@date:2017年2月3日下午3:32:31
  13. *@version:1.0
  14. */
  15.  
  16. @Controller
  17. @RequestMapping("/Key")
  18. publicclassPublicKeyController{
  19. /**
  20. *获取RSA密钥文件中的公钥
  21. *@returnString类型
  22. */
  23. @RequestMapping("/pk")
  24. @ResponseBody
  25. publicStringgetPublicKey(){
  26. /**实例化加密解密工具类*/
  27. EncryptionDecryptioned=newEncryptionDecryption();
  28. returned.getPublicKey();
  29. }
  30. }

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

  1. EncryptionDecryption.java
  1. packagecom.djzh.common.utils;
  2.  
  3. importjava.io.ByteArrayOutputStream;
  4. importjava.io.FileInputStream;
  5. importjava.io.FileOutputStream;
  6. importjava.io.ObjectInputStream;
  7. importjava.io.ObjectOutputStream;
  8. importjava.io.UnsupportedEncodingException;
  9. importjava.net.URLDecoder;
  10. importjava.net.URLEncoder;
  11. importjava.security.InvalidAlgorithmParameterException;
  12. importjava.security.InvalidKeyException;
  13. importjava.security.KeyPair;
  14. importjava.security.KeyPairGenerator;
  15. importjava.security.NoSuchAlgorithmException;
  16. importjava.security.PrivateKey;
  17. importjava.security.SecureRandom;
  18.  
  19. importjavax.crypto.BadPaddingException;
  20. importjavax.crypto.Cipher;
  21. importjavax.crypto.IllegalBlockSizeException;
  22. importjavax.crypto.NoSuchPaddingException;
  23. importjavax.crypto.spec.IvParameterSpec;
  24. importjavax.crypto.spec.SecretKeySpec;
  25.  
  26. importorg.apache.commons.codec.binary.Base64;
  27. importorg.apache.log4j.Logger;
  28.  
  29. /**
  30. *rsaaes加密解密工具类
  31. *Title:EncryptionDecryption
  32. *Company:djzh
  33. *@authorhanlin
  34. *@date2017年1月17日上午11:02:50
  35. */
  36.  
  37.  
  38. publicclassEncryptionDecryption{
  39.  
  40. /**密钥文件存储位置*/
  41. privatestaticStringRSAKeyStore="C:/RSAKey.txt";//在这个位置放这个文件
  42. /**
  43. *日志记录器
  44. */
  45. publicstaticLoggerlogger=Logger.getLogger(EncryptionDecryption.class);
  46.  
  47. /**
  48. *AES加密
  49. *@paramcontent明文
  50. *@paramkeyBytes秘钥
  51. *@paramiv偏移量
  52. *@return
  53. */
  54. publicstaticStringAES_CBC_Encrypt(Stringcontent,byte[]keyBytes,byte[]iv){
  55.  
  56. try{
  57. SecretKeySpeckey=newSecretKeySpec(keyBytes,"AES");
  58. Ciphercipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
  59. cipher.init(Cipher.ENCRYPT_MODE,newIvParameterSpec(iv));
  60. content=URLEncoder.encode(content,"UTF-8");//用url编码
  61. byte[]result=cipher.doFinal(content.getBytes());//加密
  62. returnnewString(Base64.encodeBase64(result),"UTF-8");
  63. }catch(NoSuchPaddingExceptione){
  64. e.printStackTrace();
  65. }catch(NoSuchAlgorithmExceptione){
  66. e.printStackTrace();
  67. }catch(UnsupportedEncodingExceptione){
  68. e.printStackTrace();
  69. }catch(InvalidKeyExceptione){
  70. e.printStackTrace();
  71. }catch(IllegalBlockSizeExceptione){
  72. e.printStackTrace();
  73. }catch(BadPaddingExceptione){
  74. e.printStackTrace();
  75. }catch(InvalidAlgorithmParameterExceptione){
  76. e.printStackTrace();
  77. }
  78. returnnull;
  79. }
  80.  
  81. /**
  82. *AES解密
  83. *@paramcontent密文
  84. *@paramkeyBytes秘钥
  85. *@paramiv偏移量
  86. *@return
  87. */
  88. publicstaticStringAES_CBC_Decrypt(Stringcontent,byte[]iv){
  89.  
  90. try{
  91. content=content.replaceAll("","+");
  92. byte[]decryptBaseData=Base64.decodeBase64(content.getBytes("utf-8"));
  93. SecretKeySpeckey=newSecretKeySpec(keyBytes,"AES");
  94. Ciphercipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
  95. cipher.init(Cipher.DECRYPT_MODE,newIvParameterSpec(iv));
  96. byte[]result=cipher.doFinal(decryptBaseData);
  97. returnURLDecoder.decode(newString(result),"utf-8");
  98. }catch(NoSuchPaddingExceptione){
  99. e.printStackTrace();
  100. }catch(NoSuchAlgorithmExceptione){
  101. e.printStackTrace();
  102. }catch(UnsupportedEncodingExceptione){
  103. e.printStackTrace();
  104. }catch(InvalidKeyExceptione){
  105. e.printStackTrace();
  106. }catch(IllegalBlockSizeExceptione){
  107. e.printStackTrace();
  108. }catch(BadPaddingExceptione){
  109. e.printStackTrace();
  110. }catch(InvalidAlgorithmParameterExceptione){
  111. e.printStackTrace();
  112. }
  113. returnnull;
  114. }
  115.  
  116. /**
  117. *字符串转为byte[]
  118. *@paramhexString
  119. *@return
  120. */
  121. publicstaticbyte[]hexStringToBytes(StringhexString){
  122. if(hexString==null||hexString.equals("")){
  123. returnnull;
  124. }
  125. hexString=hexString.toUpperCase();
  126. intlength=hexString.length()/2;
  127. char[]hexChars=hexString.tocharArray();
  128. byte[]d=newbyte[length];
  129. for(inti=0;i<length;i++){
  130. intpos=i*2;
  131. d[i]=(byte)(charToByte(hexChars[pos])<<4|charToByte(hexChars[pos+1]));
  132. }
  133. returnd;
  134. }
  135.  
  136. /**
  137. *Convertchartobyte
  138. *@paramcchar
  139. *@returnbyte
  140. */
  141. privatestaticbytecharToByte(charc){
  142. return(byte)"0123456789ABCDEF".indexOf(c);
  143. }
  144.  
  145. /**
  146. *解密由RSA加密的AES的key和iv
  147. *@parampara
  148. *@return
  149. *@throwsException
  150. */
  151. publicstaticbyte[]getValue(Stringparam)throwsException{
  152. byte[]trueValue=null;
  153. try{
  154. if(!param.equals("")&&param!=null){
  155. byte[]KeyB=hexStringToBytes(param);
  156. KeyB=decrypt(getKeyPair().getPrivate(),KeyB);
  157. StringBuffersbKey=newStringBuffer();
  158. sbKey.append(newString(KeyB));
  159. param=sbKey.reverse().toString();
  160. trueValue=URLDecoder.decode(param,"UTF-8").getBytes();
  161. }
  162. }catch(Exceptione){
  163. //重要参数值
  164. logger.error("传入参数:"+"param:"+param);
  165. //异常说明
  166. logger.error("解密由RSA加密的AES的key和iv失败,可能前台传入的aKey或者aIv为空");
  167. e.printStackTrace();
  168. }
  169. returntrueValue;
  170. }
  171.  
  172. /**
  173. *获取密钥文件中的公钥
  174. *@return
  175. */
  176. publicStringgetPublicKey(){
  177. ObjectpublicKey=null;
  178. StringpublicKEY=null;
  179. try{
  180. publicKey=getKeyPair().getPublic();
  181. publicKEY=(String)publicKey.toString().subSequence(37,293);
  182. }catch(Exceptione){
  183. e.printStackTrace();
  184. }
  185. returnpublicKEY;
  186. }
  187.  
  188. /**
  189. *RSA生成密钥对
  190. *@return
  191. *@throwsException
  192. */
  193. publicstaticKeyPairgenerateKeyPair()throwsException{
  194. try{
  195. KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance("RSA",neworg.bouncycastle.jce.provider.BouncyCastleProvider());
  196. finalintKEY_SIZE=1024;
  197. keyPairGen.initialize(KEY_SIZE,newSecureRandom());
  198. KeyPairkeyPair=keyPairGen.generateKeyPair();
  199. FileOutputStreamfos=newFileOutputStream(RSAKeyStore);
  200. ObjectOutputStreamoos=newObjectOutputStream(fos);
  201. oos.writeObject(keyPair);
  202. oos.close();
  203. fos.close();
  204. returnkeyPair;
  205. }catch(Exceptione){
  206. thrownewException(e.getMessage());
  207. }
  208. }
  209.  
  210. /**
  211. *获取密钥对
  212. *@return
  213. *@throwsException
  214. */
  215. publicstaticKeyPairgetKeyPair()throwsException{
  216. FileInputStreamfis=newFileInputStream(RSAKeyStore);
  217. ObjectInputStreamoos=newObjectInputStream(fis);
  218. KeyPairkp=(KeyPair)oos.readObject();
  219. oos.close();
  220. fis.close();
  221. returnkp;
  222. }
  223.  
  224. /**
  225. *解密
  226. *@parampk
  227. *@paramraw
  228. *@return
  229. *@throwsException
  230. */
  231. @SuppressWarnings("static-access")
  232. privatestaticbyte[]decrypt(PrivateKeypk,byte[]raw)throwsException{
  233. try{
  234. Ciphercipher=Cipher.getInstance("RSA",neworg.bouncycastle.jce.provider.BouncyCastleProvider());
  235. cipher.init(cipher.DECRYPT_MODE,pk);
  236. intblockSize=cipher.getBlockSize();
  237. ByteArrayOutputStreambout=newByteArrayOutputStream(64);
  238. intj=0;
  239.  
  240. while(raw.length-j*blockSize>0){
  241. bout.write(cipher.doFinal(raw,j*blockSize,blockSize));
  242. j++;
  243. }
  244. returnbout.toByteArray();
  245. }catch(Exceptione){
  246. thrownewException(e.getMessage());
  247. }
  248. }
  249. }

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

  1. C:/RSAKey.txt

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

  1. functiondataAjaxRefer(){
  2. //筛选条件的参数进行加密
  3. varkeyRSA=bodyRSA();//生成RSA加密用的key
  4. varkey=randomString();//随机生成AES的key和iv
  5. variv=randomString();
  6. varaKey=encryptedString(keyRSA,encodeURIComponent(key));//RSA加密AES的key
  7. varaIv=encryptedString(keyRSA,encodeURIComponent(iv));//RSA加密AES的iv
  8. varselect1=$("#jffpqh").val();//参数1
  9. varselectText1_=getAesString(encodeURIComponent(select1),iv);//AES参数内容1
  10. //筛选条件的参数
  11. vardata={
  12. jffpqh:selectText1_,//参数1
  13. aKey:aKey,aIv:aIv
  14. }
  15. //console.log(data)
  16. $.ajax({
  17. type:"post",url:"/GHGL/Distribution/showFundsTerm",//请求的url,本例为springMVC框架
  18. async:true,data:data,dataType:"json",success:function(data){
  19. vardecryptedStr=getDAesString(data,iv);//解密
  20. }
  21. },errorThrown){
  22. alert(XMLHttpRequest.status);
  23. alert(XMLHttpRequest.readyState);
  24. alert(textStatus);
  25. },complete:function(XMLHttpRequest,textStatus){
  26. this;//调用本次AJAX请求时传递的options参数
  27. }
  28. });
  29. }

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

猜你在找的Ajax相关文章