国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端使用 crypto-js 庫 aes加解密

這篇具有很好參考價(jià)值的文章主要介紹了前端使用 crypto-js 庫 aes加解密。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前端使用crypto-js AES 加密解密

CryptoJS是一個(gè)JavaScript加密算法庫,用于在客戶端瀏覽器中執(zhí)行加密和解密操作。它提供了一系列常見的加密算法,如AES、DES、Triple DES、Rabbit、RC4、MD5、SHA-1等等。

AES

工作原理

AES(高級(jí)加密標(biāo)準(zhǔn))是一種對(duì)稱加密算法,即加密和解密使用相同的密鑰。它可以加密長度為128、192和256位的數(shù)據(jù)塊,并使用128位的密鑰進(jìn)行加密。AES算法使用了固定的塊長度和密鑰長度,并且被廣泛應(yīng)用于許多安全協(xié)議和標(biāo)準(zhǔn)中,例如SSL/TLS、SSH、IPSec等。

在AES加密中,明文被分成128位的塊,每個(gè)塊使用相同的密鑰進(jìn)行加密。加密過程包括以下步驟:

  • 密鑰擴(kuò)展:將密鑰擴(kuò)展為加密算法所需的輪密鑰。

  • 初始輪:將明文分成塊,并與第一輪密鑰進(jìn)行異或。

  • 多輪加密:將初始輪產(chǎn)生的結(jié)果反復(fù)進(jìn)行多輪加密,每輪使用不同的輪密鑰進(jìn)行加密。

  • 最終輪:在最后一輪加密中,將塊進(jìn)行加密,但是不再進(jìn)行下一輪加密,而是直接輸出密文。

解密過程與加密過程類似,只是將加密過程中的步驟反過來。需要注意的是,解密的過程中使用的是相同的密鑰和輪密鑰。由于AES是一種塊加密算法,因此在加密過程中,需要對(duì)數(shù)據(jù)進(jìn)行填充,確保數(shù)據(jù)塊大小為128位。

AES算法的優(yōu)點(diǎn)
  • 安全性高:AES算法是一種可靠的加密算法,它在數(shù)據(jù)傳輸、文件加密和網(wǎng)絡(luò)安全等領(lǐng)域有著廣泛的應(yīng)用。

  • 效率高:AES算法采用對(duì)稱加密算法進(jìn)行加密和解密,使用相同的密鑰進(jìn)行加密和解密。對(duì)稱加密算法比非對(duì)稱加密算法更加高效,因此AES算法具有更高的效率。

  • 應(yīng)用廣泛:AES算法在數(shù)據(jù)傳輸、文件加密和網(wǎng)絡(luò)安全等領(lǐng)域有著廣泛的應(yīng)用。在數(shù)據(jù)傳輸過程中,AES算法可以對(duì)數(shù)據(jù)進(jìn)行加密,保護(hù)數(shù)據(jù)的安全性。在文件加密過程中,AES算法可以對(duì)文件進(jìn)行加密,保護(hù)文件的安全性。在網(wǎng)絡(luò)安全領(lǐng)域,AES算法可以對(duì)網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行加密,保護(hù)網(wǎng)絡(luò)的安全性。

github地址: https://github.com/brix/crypto-js

cryptojs文檔: https://cryptojs.gitbook.io/docs/#encoders

在線aes加密解密工具: http://tool.chacuo.net/cryptaes

安裝

script 標(biāo)簽嵌入

<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/aes.min.js"></script>

npm 或 yarn 安裝

npm install crypto-js

yarn add crypto-js

CommonJS

const CryptoJS = require('crypto-js');

ES module:

import CryptoJS from 'crypto-js';
封裝加密和解密
import CryptoJS from 'crypto-js'

 // ------------AES-------------
 
 function getAesString(data, key, iv) { //加密
   let keys = CryptoJS.enc.Utf8.parse(key)
   let vis = CryptoJS.enc.Utf8.parse(iv)
   let encrypt = CryptoJS.AES.encrypt(data, keys, {
     iv: vis, //iv偏移量 CBC需加偏移量
     mode: CryptoJS.mode.CBC, //CBC模式
     // mode: CryptoJS.mode.ECB, //ECB模式
     padding: CryptoJS.pad.Pkcs7 //padding處理
   });
   // debugger
   return encrypt.toString(); //加密完成后,轉(zhuǎn)換成字符串
 }
 
 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 decrypted.toString(CryptoJS.enc.Utf8);
 }

 // AES 對(duì)稱秘鑰加密
 const aes = {
   en: (data, key) => getAesString(data, key.key, key.iv),
   de: (data, key) => getDAesString(data, key.key, key.iv)
 };
 // BASE64
 const base64 = {
   en: (data) => CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data)),
   de: (data) => CryptoJS.enc.Base64.parse(data).toString(CryptoJS.enc.Utf8)
 };
 // SHA256
 const sha256 = (data) => {
   return CryptoJS.SHA256(data).toString();
 };
 // MD5
 const md5 = (data) => {
 return CryptoJS.MD5(data).toString();
 };
 
 export { aes, md5, sha256, base64 };
 
使用 JSEncrypt 生成密鑰

JSEncrypt是基于JavaScript的RSA加密庫,允許在瀏覽器端使用RSA算法進(jìn)行加密和解密操作。它提供了容易使用的API,簡化了在客戶端上進(jìn)行加密的過程。

JSEncrypt支持以下操作:

  • 生成密鑰對(duì): 可以使用JSEncrypt生成RSA密鑰對(duì),包括公鑰和私鑰。

  • 加密: 使用公鑰加密數(shù)據(jù),確保只有擁有私鑰的服務(wù)器才能解密。

  • 解密: 使用私鑰解密被公鑰加密過的數(shù)據(jù)。

  • 密鑰格式: JSEncrypt支持多種密鑰格式,包括PEM格式(基于Base64編碼)。

使用JSEncrypt進(jìn)行RSA加密的基本步驟如下:

  • 引入JSEncrypt庫: 在HTML頁面中引入JSEncrypt庫的腳本文件。

  • 創(chuàng)建JSEncrypt對(duì)象: 使用JSEncrypt構(gòu)造函數(shù)創(chuàng)建一個(gè)新的JSEncrypt對(duì)象。

  • 生成密鑰對(duì): 封裝getKey()方法生成RSA密鑰對(duì),并將生成的私鑰加密后傳給后端。

  • 加密數(shù)據(jù): 使用encrypt.encrypt(plainText)方法,將明文數(shù)據(jù)進(jìn)行加密。

  • 解密數(shù)據(jù): 在服務(wù)器端使用私鑰進(jìn)行解密,獲取原始數(shù)據(jù)。

需要注意的是,由于JSEncrypt是在客戶端上執(zhí)行的,所以密鑰在傳輸過程中可能會(huì)存在安全風(fēng)險(xiǎn)。為了確保數(shù)據(jù)的安全性,建議在客戶端和服務(wù)器之間使用安全的通信協(xié)議進(jìn)行數(shù)據(jù)傳輸,并在服務(wù)器端進(jìn)行進(jìn)一步的安全驗(yàn)證和處理。

import JSEncrypt from 'jsencrypt'
const encrypt = new JSEncrypt();
let publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeCDcnFrS7DIRbvZLHreVUzaMbAFy2DYmioxBK606urY4rVR8IgLgUhnyw2/GQ99pyr8lGtqPeOoapantw1XwEVyi74MDxs4UDL8j4OZR1Es7HVGOB0GwKWobdU9cm/1iDwGyouSmijxKyAePg6KsLNgbjDPYZRS11bYEuZ8/RLQIDAQAB';
encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + publicKey + '-----END PUBLIC KEY-----')

const random = (length) => {
  var str = Math.random().toString(36).substr(2);
  if (str.length>=length) {
    return str.substr(0, length);
  }
  str += random(length-str.length);
  return str;
}

export const rsaEncode = (src)=>{
  let data = encrypt.encrypt(src); // 加密
  return data
};

export const getKey = ()=>{
  let key = { key: random(16), iv: random(16) }; // 生成密鑰
  let code = rsaEncode(key.key + ',' + key.iv) // 給密鑰加密,在將加密后的密鑰傳給后端
  window.codeArr = window.codeArr || {}
  codeArr[code] = key
  return {
    key, code
  }
};

export const getAesKey = (aes)=>{
  let key = JSON.parse(JSON.stringify(codeArr[aes]))
  delete codeArr[aes]
  return key
};



window.getKey = getKey
window.rsaEncode = rsaEncode

publicKey 可以通過發(fā)請(qǐng)求后端返回,也可以自己定義,要求前后端一致

封裝 axios 攔截器進(jìn)行加密解密
/**
 *
 * http配置
 *
 */
// 引入axios以及element ui中的loading和message組件
import { aes } from "@/util/encrypt.js";
import { getKey, getAesKey } from "@/config/key.js";
import axios from "axios";
import store from "../store";
import router from "../router/router";
import { Loading, Message } from "element-ui";
import { getSessStore, setSessStore } from "@/util/store";


// 超時(shí)時(shí)間
if (store.online) axios.defaults.timeout = 20000;
else axios.defaults.timeout = 0;
//跨域請(qǐng)求,允許保存cookie
axios.defaults.withCredentials = true;

// 統(tǒng)一加解密
const Unify = {
  // 統(tǒng)一加密方法
  en(data, key) {
    // 1.aes加密
    let aesStr = aes.en(JSON.stringify(data), key);
    return aesStr;
  },
  // 統(tǒng)一解密
  de(aesStr, key) {
    // 1.aes解密
    let dataStr = aes.de(aesStr, key);
    // 3.轉(zhuǎn)json對(duì)象
    let data = JSON.parse(dataStr);
    return data;
  },
};

let loadinginstace;
let cfg, msg;
msg = "服務(wù)器君開小差了,請(qǐng)稍后再試";
function ens(data) {
  // debugger
  let src = [...data];
  src = JSON.stringify(src);
  let dataJm = aes.en(src);
  return dataJm;
}
function des(data) {
  // debugger
  let src = [...data];
  let dataJm = aes.de(src);
  dataJm = JSON.parse(dataJm);
  return dataJm;
}
const cancelToken = axios.CancelToken
const source = cancelToken.source()
//HTTPrequest攔截
axios.interceptors.request.use(
  function (config) {
    console.log(config.data, "加密前入?yún)?--");
    config.cancelToken = source.token; // 全局添加cancelToken
    loadinginstace = Loading.service({
      fullscreen: true,
    });
    if (store.getters.token) {
      let info = getSessStore("token");
      // console.log("info", info);
      config.headers["Authorization"] = "Bearer " + info; // 讓每個(gè)請(qǐng)求攜帶token-- ['X-Token']為自定義key 請(qǐng)根據(jù)實(shí)際情況自行修改
    }
    const contenttype = config.headers.common["Accept"];
    let types = contenttype.includes("application/json");
    let key = getKey(); // 獲取密鑰
    config.headers["aes"] = key.code; // 將 aes 的 code 設(shè)置到請(qǐng)求頭,傳給后端解密
    config.headers["name"] = "send";
    if (types) {
      if (config.method == "post" || config.method == "put") {
        if (config.data) {
          config.headers["crypto"] = true;
          config.headers["content-type"] = "application/json";
          let data = {
            body: config.data,
          };
          let dataJm = Unify.en(data, key.key); // 加密 post 請(qǐng)求參數(shù)
          config.data = dataJm;
        }
      }
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

//HTTPresponse攔截
axios.interceptors.response.use(
  (response) => {
    loadinginstace.close();
    let res = response.data || {};
    if (response.headers["date"]) {
      store.commit("setServiceTime", response.headers.date);
    }
    if (res.crypto) {
      try {
        let key = getAesKey(response.headers.aes); /// 拿到公鑰加密字符串
        if (!key) {
          message("獲取密鑰異常", "error");
          return Promise.reject(res);
        }
        // debugger
        res = Unify.de(res.body, key);
        response.data = res;
      } catch (err) {
        message("系統(tǒng)異常:" + err.message, "error");
        return Promise.reject(err);
      }
    }
    // debugger
    if (res.code === 1) {
      message(res.msg, "error");
      return Promise.reject(res);
    }
    console.log(response, "解密后response");
    return response;
  },
  (error) => {
    console.log("錯(cuò)誤信息", error);
    loadinginstace.close();
    const res = error.response || {};
    if (res.status === 478 || res.status === 403 || res.status === 401) {
      let resMsg = res.data.msg ? res.data.msg : res.data.data
      if (res.status === 403) {
        message('服務(wù)授權(quán)失敗,請(qǐng)聯(lián)系管理添加權(quán)限!', "error");
      } else {
        message(resMsg, "error");
      }
      let flg = res.data.msg.includes('當(dāng)前登錄狀態(tài)已失效')
      if (res.status === 478 && flg) {
        //token失效
        source.cancel('登錄信息已過期'); // 取消其他正在進(jìn)行的請(qǐng)求
        store.dispatch("FedLogOut").then(() => {
          router.push("/login"); ///test
        });
      }
    } else if (res.status === 400) {
      message(res.data.error_description, "error");
    } else if (res.status === 202) {
      //三方未綁定
      this.$router.push({
        path: "/",
      });
    } else if (res.status === 503 || res.status === 504) {
      //服務(wù)異常
      message(res.data, "error");
    } else if (
      (res.status === 401 && res.statusText == "Unauthorized") ||
      res.data.error == "invalid_token" ||
      res.data.error == "unauthorized"
    ) {
      //token失效
      store.dispatch("FedLogOut").then(() => {
        router.push("/login"); ///test
      });
    } else {
      message(res.data.message, "error");
    }
    return Promise.reject(error);
  }
);
export function message(text, type) {
  let t = text ? text : "服務(wù)或網(wǎng)絡(luò)異常!"
  Message({
    message: t,
    type: type,
    duration: 30 * 1000,
    center: true,
    showClose: true
  });
}
export default axios;

總結(jié)

加密: 使用 JSEncrypt 生成私鑰 key 并將密鑰 key 加密得到 code, 使用 CryptoJS.AES.encrypt() 和 key 加密請(qǐng)求數(shù)據(jù),將 加密后的 code 設(shè)置在請(qǐng)求頭,后端獲取加密后 code 進(jìn)行解密得到私鑰 key ,再對(duì)請(qǐng)求數(shù)據(jù)解密得到原始數(shù)據(jù)
解密: 前端獲取響應(yīng)頭的key,通過解密 JSEncrypt 解密得到私鑰 key, 使用 CryptoJS.AES.decrypt() 方法對(duì)響應(yīng)數(shù)據(jù)進(jìn)行解密,得到原始數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-762937.html

到了這里,關(guān)于前端使用 crypto-js 庫 aes加解密的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端js加密庫的簡單使用——crypto-js、jsrsasign、jsencrypt

    個(gè)人經(jīng)驗(yàn),這三個(gè)加密庫的組合是最佳解決方案 crypto-js、jsrsasign、jsencrypt crypto-js 進(jìn)行 AES 對(duì)稱加密 jsrsasign 生成 RSA 密鑰對(duì) jsencrypt 進(jìn)行 RSA 加解密

    2024年02月11日
    瀏覽(52)
  • js 微信小程序aes解密-CryptoJS

    隨著微信小程序的不斷發(fā)展,js這門技術(shù)也越來越重要,很多人都開啟了學(xué)習(xí)js,本文就介紹了aes解密。 crypto-js 是一個(gè)純 javascript 寫的加密算法類庫 ,可以非常方便地在 javascript 進(jìn)行 MD5、SHA1、SHA2、SHA3、RIPEMD-160 哈希散列,進(jìn)行 AES、DES、Rabbit、RC4、Triple DES 加解密。 我們可

    2024年02月16日
    瀏覽(29)
  • 前端CryptoJS-AES加解密 對(duì)應(yīng)php的AES-128-CBC加解密踩坑(java也相同加解密)

    ?前端部分注意看填充是pkcs7 有個(gè)前提,要看前端有沒有轉(zhuǎn)成hex格式,如果沒轉(zhuǎn),php那邊就不需要調(diào)用特定函數(shù)轉(zhuǎn)hex格式的 后端php代碼

    2024年02月15日
    瀏覽(23)
  • uni-app crypto-js DES 加解密 ,支持app , h5,小程序

    uni-app crypto-js DES 加解密 ,支持app , h5,小程序

    crypto-js DES 加解密 ,支持app,h5,小程序 第一步 npm install crypto-js 可以直接下載示例運(yùn)行,看控制臺(tái)打印 下載地址?https://ext.dcloud.net.cn/plugin?id=13351 crypto-js DES 加解密 - DCloud 插件市場(chǎng)

    2024年02月12日
    瀏覽(25)
  • 微信小程序使用crypto-js

    還是那個(gè)沒有任何開發(fā)意義的小程序!?。∵@次的要求我就有點(diǎn)看不懂了,這是公司在日本出差的大佬寫的接口,平時(shí)交流發(fā)在群里的文檔全他喵是英文的,這讓我連四級(jí)都沒考過的怎么看的懂呢(是真的“沒考過”),所以菜不是沒有道理的。 在此之前大致搜索了一下xx

    2024年02月05日
    瀏覽(19)
  • 解決cryptoJS.AES默認(rèn)參數(shù)加密,java無法解密的問題

    有時(shí)候我們需要跨編程語言進(jìn)行加密加密。比如nodejs里面加密,java里面解密,或者反過來java加密,nodejs解密。node可以使用cryptojs,java可以使用javax.crypto.Cipher包。 網(wǎng)上有很多關(guān)于這方面的文章。然而如果node使用了默認(rèn)的參數(shù)進(jìn)行加密(比如現(xiàn)有業(yè)務(wù)已經(jīng)生成了一些已經(jīng)加密

    2024年02月11日
    瀏覽(75)
  • 使用CryptoJS實(shí)現(xiàn)Vue前端加密,Java后臺(tái)解密的步驟和方法

    1、crypto.js簡介 ??CryptoJS 是一個(gè) JavaScript 庫,提供了一系列密碼學(xué)函數(shù)和工具,用于加密、解密、生成摘要等任務(wù)。它支持多種加密算法,包括常見的對(duì)稱加密算法(如 AES、DES)和非對(duì)稱加密算法(如 RSA)。 ??同時(shí),CryptoJS還包括了ECB和CBC兩種模式,其中 ECB模式 :全稱

    2024年02月04日
    瀏覽(26)
  • AES對(duì)稱加密實(shí)戰(zhàn)——前端js加密后端python解密

    AES對(duì)稱加密實(shí)戰(zhàn)——前端js加密后端python解密

    高級(jí)加密標(biāo)準(zhǔn)(AES, Advanced Encryption Standard),是一種最常見的對(duì)稱加密算法 。其加密流程如下圖所示,發(fā)送方通過密鑰對(duì)明文加密后進(jìn)行網(wǎng)絡(luò)傳輸,接收方用同樣的密鑰將密文解密。在前后端通訊場(chǎng)景中,可利用AES算法對(duì)用戶密碼進(jìn)行加密后傳輸,防止被抓包而造成密碼泄露。

    2024年02月04日
    瀏覽(25)
  • 【高?!縞rypto-js<3.2.1 存在不安全的隨機(jī)性漏洞

    【高危】crypto-js<3.2.1 存在不安全的隨機(jī)性漏洞

    crypto-js 是一個(gè) JavaScript 加密庫,用于在瀏覽器和 Node.js 環(huán)境中執(zhí)行加密和解密操作。 crypto-js 3.2.1 之前版本中的 secureRandom 函數(shù)通過將字符串 0. 和三位隨機(jī)整數(shù)拼接的格式生成加密字符串,攻擊者可通過爆破破解加密字符。 漏洞名稱 crypto-js3.2.1 存在不安全的隨機(jī)性漏洞 漏洞

    2024年02月10日
    瀏覽(25)
  • python調(diào)用js文件加密時(shí)Cannot find module ‘crypto-js‘解決辦法

    首先安裝node.js 記得把node.js安裝在你python代碼文件的目錄下,雖然有點(diǎn)亂,但是這樣不容易出現(xiàn)其他問題,其次 然后把https://wwor.lanzoue.com/iE5Is0ixp9ef這個(gè)鏈接里面的壓縮包直接解壓到你代碼文件那個(gè)node_modules里面,這個(gè)鬼東西就是你node.js安裝的目錄下

    2024年02月16日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包