欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

CryptoJS中AES實(shí)現(xiàn)前后端通用加解密技術(shù)

 更新時(shí)間:2018年12月18日 10:14:15   作者:ZCF1024  
這篇文章主要為大家詳細(xì)介紹了CryptoJS中AES實(shí)現(xiàn)前后端通用加解密技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在項(xiàng)目中如果要對(duì)前后端傳輸?shù)臄?shù)據(jù)雙向加密, 比如避免使用明文傳輸用戶(hù)名,密碼等數(shù)據(jù)。 就需要對(duì)前后端數(shù)據(jù)用同種方法進(jìn)行加密,方便解密。這里介紹使用 CryptoJS 實(shí)現(xiàn) AES 加解密。

首先需要下載前臺(tái)使用 CryptoJS 實(shí)現(xiàn) AES 加解密的,所以要先下載組件,下載 CryptoJS-v3.1.2 版本之后,文件中包含components 和 rollups 兩個(gè)文件夾,components 文件夾下是單個(gè)組件,rollups 文件夾下是匯總,引用 rollups 下的 aes.js 文件即可。

已解決解密數(shù)據(jù)時(shí)出現(xiàn)的異常: exception:javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

 這里提供 CryptoJS-v3.1.2 的 Github鏈接

 先上后臺(tái)Java代碼: 

package com.company.pms.pmsbase.utils;
 
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
 
import org.apache.commons.codec.binary.Base64;
 
public class AesUtil {
 
 public static void main(String args[]) throws Exception {
 
  String content = "明文 123 abc";
 
  //加密
  String encrypted = encrypt(content, KEY, IV);
  //解密
  String decrypted = decrypt(encrypted, KEY, IV);
 
  System.out.println("加密前:" + content);
 
  System.out.println("加密后:" + encrypted);
 
  System.out.println("解密后:" + decrypted);
 }
 
 private static String KEY = "abcdef0123456789"; // 長(zhǎng)度必須是 16
 
 private static String IV = "abcdef0123456789"; // 長(zhǎng)度必須是 16
 
 /**
  * 加密返回的數(shù)據(jù)轉(zhuǎn)換成 String 類(lèi)型
  * @param content 明文
  * @param key 秘鑰
  * @param iv 初始化向量是16位長(zhǎng)度的字符串
  * @return
  * @throws Exception
  */
 public static String encrypt(String content, String key, String iv) throws Exception {
  // 將返回的加密過(guò)的 byte[] 轉(zhuǎn)換成Base64編碼字符串 ?。。。『荜P(guān)鍵
  return base64ToString(AES_CBC_Encrypt(content.getBytes(), key.getBytes(), iv.getBytes()));
 }
 
 /**
  * 將解密返回的數(shù)據(jù)轉(zhuǎn)換成 String 類(lèi)型
  * @param content Base64編碼的密文
  * @param key 秘鑰
  * @param iv 初始化向量是16位長(zhǎng)度的字符串
  * @return
  * @throws Exception
  */
 public static String decrypt(String content, String key, String iv) throws Exception {
  // stringToBase64() 將 Base64編碼的字符串轉(zhuǎn)換成 byte[] !!!與base64ToString()配套使用
  return new String(AES_CBC_Decrypt(stringToBase64(content), key.getBytes(), iv.getBytes()));
 }
 
 private static byte[] AES_CBC_Encrypt(byte[] 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));
   byte[] result = cipher.doFinal(content);
   return result;
  } catch (Exception e) {
   System.out.println("exception:"+e.toString());
  }
  return null;
 }
 
 private static byte[] AES_CBC_Decrypt(byte[] content, byte[] keyBytes, byte[] iv){
  try {
   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(content);
   return result;
  } catch (Exception e) {
   System.out.println("exception:"+e.toString());
  }
  return null;
 }
 
 /**
  * 字符串裝換成 Base64
  */
 
 public static byte[] stringToBase64(String key) throws Exception {
  return Base64.decodeBase64(key.getBytes());
 }
 
 /**
  * Base64裝換成字符串
  */
 public static String base64ToString(byte[] key) throws Exception {
  return new Base64().encodeToString(key);
 }
 
}

再上前端代碼(需引用 rollups 目錄下的 aes.js ):

function encodeAesString(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 
 });
 //返回的是base64格式的密文 
 return encrypted;
}
 
// encrypted 為是base64格式的密文
function decodeAesString(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 decrypted.toString(CryptoJS.enc.Utf8);
}
 
// 測(cè)試加、解密
function testAES(){
 var data = "明文 123 abc"; // 明文 
 var key = 'abcdef0123456789'; // 密鑰 長(zhǎng)度16
 var iv = 'abcdef0123456789'; // 密鑰 長(zhǎng)度16
 
 console.log("加密前:" + data);
 
 // 測(cè)試加密
 var encrypted = encodeAesString(data,key,iv); // 密文
 console.log("加密后: " + encrypted);
 
 var decryptedStr = decodeAesString(encrypted,key,iv);
 console.log("解密后: " + decryptedStr);
}

貼上效果圖:

中間遇到的問(wèn)題: 

    1.  秘鑰問(wèn)題, 秘鑰的長(zhǎng)度必須為16位, 否則會(huì)報(bào)錯(cuò)

    2. 加密得到的 byte[] 需用使用Base64轉(zhuǎn)換成字符串, 不能直接轉(zhuǎn)成字符串,因?yàn)榧用芩捎玫腁ES, MD5, SHA-256, SHA-512 等等算法,它們是通過(guò)對(duì)byte[] 進(jìn)行各種變換和運(yùn)算,得到加密之后的byte[],那么這個(gè)加密之后的 byte[] 結(jié)果顯然 就不會(huì)符合任何一種的編碼方案,比如 UTF-8, GBK等,因?yàn)榧用艿倪^(guò)程是任意對(duì)byte[]進(jìn)行運(yùn)算的。所以你用任何一種編碼方案來(lái)解碼 加密之后的 byte[] 結(jié)果,得到的都會(huì)是亂碼。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • DLL+ ActiveX控件+WEB頁(yè)面調(diào)用例子

    DLL+ ActiveX控件+WEB頁(yè)面調(diào)用例子

    因項(xiàng)目需要,開(kāi)始學(xué)習(xí)并研究VC、DLL及ActiveX控件,網(wǎng)上資料找了很多,但沒(méi)一個(gè)可用的或者說(shuō)沒(méi)一個(gè)例子可理解并運(yùn)行的。沒(méi)辦法,自己研究吧。功夫不負(fù)有心人,終有小成了,呵呵,現(xiàn)在把自己學(xué)習(xí)總結(jié)了一下,獻(xiàn)給需要的人。
    2010-08-08
  • JavaScript實(shí)現(xiàn)動(dòng)態(tài)生成表格

    JavaScript實(shí)現(xiàn)動(dòng)態(tài)生成表格

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)動(dòng)態(tài)生成表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 微信小程序使用ECharts的示例詳解

    微信小程序使用ECharts的示例詳解

    echarts-for-weixin是ECharts官方維護(hù)的一個(gè)開(kāi)源項(xiàng)目,提供了一個(gè)微信小程序組件,可以通過(guò)這個(gè)組件在微信小程序中使用?ECharts?繪制圖表。本文將通過(guò)示例詳解微信小程序使用ECharts的方法,感興趣的可以了解一下
    2022-06-06
  • Echarts圖表如何利用formatter自定義tooltip的內(nèi)容和樣式

    Echarts圖表如何利用formatter自定義tooltip的內(nèi)容和樣式

    這篇文章主要給大家介紹了關(guān)于Echarts圖表如何利用formatter自定義tooltip的內(nèi)容和樣式的相關(guān)資料,echarts的圖表配置非常的靈活自由,但是不熟悉的時(shí)候容易不知道怎么配置,需要的朋友可以參考下
    2023-06-06
  • js控制文本框只輸入數(shù)字和小數(shù)點(diǎn)的方法

    js控制文本框只輸入數(shù)字和小數(shù)點(diǎn)的方法

    這篇文章主要介紹了js控制文本框只輸入數(shù)字和小數(shù)點(diǎn)的方法,實(shí)例分析了javascript使用正則表達(dá)式實(shí)現(xiàn)限制數(shù)字和小數(shù)點(diǎn)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 在Javascript操作JSON對(duì)象,增加 刪除 修改的簡(jiǎn)單實(shí)現(xiàn)

    在Javascript操作JSON對(duì)象,增加 刪除 修改的簡(jiǎn)單實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇在Javascript操作JSON對(duì)象,增加 刪除 修改的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • JavaScript中的 attribute 和 jQuery中的 attr 方法淺析

    JavaScript中的 attribute 和 jQuery中的 attr 方法淺析

    這篇文章主要介紹了JavaScript中的 attribute 和 jQuery中的 attr 方法淺析,需要的朋友可以參考下
    2017-01-01
  • js+css實(shí)現(xiàn)換膚效果

    js+css實(shí)現(xiàn)換膚效果

    這篇文章主要為大家詳細(xì)介紹了js+css實(shí)現(xiàn)換膚效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 簡(jiǎn)單談?wù)刟xios中的get,post方法

    簡(jiǎn)單談?wù)刟xios中的get,post方法

    下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)刟xios中的get,post方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 獲取鼠標(biāo)在div中的相對(duì)位置的實(shí)現(xiàn)代碼

    獲取鼠標(biāo)在div中的相對(duì)位置的實(shí)現(xiàn)代碼

    如何獲取鼠標(biāo)在div中的相對(duì)位置,其實(shí)是很簡(jiǎn)單,下有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下
    2013-12-12

最新評(píng)論