js通過AES進(jìn)行加解密(ECB、CBC模式)
加密需求
在項(xiàng)目開發(fā)中,由于需要對接口傳參的敏感信息進(jìn)行加密傳輸,后端接口返回的參數(shù)也是進(jìn)行加密過的,此時(shí)就需要進(jìn)行加解密操作。
本篇文章使用AES進(jìn)行加解密,AES加密算法提供了五種不同的工作模式:CBC,ECB,CTR,CFB,OFB
這里只對CBC和ECB加解密進(jìn)行說明,這兩種加密模式在前端使用時(shí)主要區(qū)別如下:
- 一種基礎(chǔ)的加密方式,密文被分割成分組長度相等的塊(不足補(bǔ)齊),然后單獨(dú)一個(gè)個(gè)加密,一個(gè)個(gè)輸出組成密文。
- 一種循環(huán)模式,前一個(gè)分組的密文和當(dāng)前分組的明文異或或操作后再加密,這樣做的目的是增強(qiáng)破解難度。(不容易主動攻擊,安全性好于ECB,是SSL、IPSec的標(biāo)準(zhǔn))
AES加解密
安裝依賴
npm install crypto-js --save-dev
封裝加解密方法(ECB模式)
將以下方法進(jìn)行封裝,文件命名為aes.js
// 引入 import CryptoJS from 'crypto-js' // 密鑰 const AES_KEY = '****************' // 后端提供 // 加密 export function encrypt ({ word }) { const key = CryptoJS.enc.Utf8.parse(AES_KEY) const srcs = CryptoJS.enc.Utf8.parse(word) const encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }) return encrypted.toString() } // 解密 export function decrypt ({ word }) { var key = CryptoJS.enc.Utf8.parse(AES_KEY) var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }) return CryptoJS.enc.Utf8.stringify(decrypt).toString() }
使用
// 引入aes.js,注意文件路徑不要出錯(cuò) import { encrypt, decrypt } from './aes' // data:需要加密的數(shù)據(jù) // encryptData:加密后的密文 // 若有需要?jiǎng)t將js對象轉(zhuǎn)換為字符串后進(jìn)行加密:JSON.stringify(data) const encryptData = encrypt({ word: JSON.stringify(data) }) // data:需要解密的密文 // decryptData:解密后的數(shù)據(jù) // 若解密結(jié)果為json字符串,則可以通過JSON.parse()方法將解密結(jié)果轉(zhuǎn)化為json對象 const decryptData = decrypt({ word: data})
封裝加解密方法(CBC模式)
將以下方法進(jìn)行封裝,文件命名為aes.js
// 引入 import CryptoJS from 'crypto-js' // 密鑰 const AES_KEY = '****************' // 后端提供 // 初始化向量 const IV = '****************' // 后端提供 //加密方法 export function encrypt( word ) { let key = CryptoJS.enc.Utf8.parse(AES_KEY) let iv = CryptoJS.enc.Utf8.parse(IV) let srcs = CryptoJS.enc.Utf8.parse(word) let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }); return encrypted.toString(); } //解密方法 export function decrypt( word ) { var key = CryptoJS.enc.Utf8.parse(AES_KEY) let iv = CryptoJS.enc.Utf8.parse(IV) var decrypt = CryptoJS.AES.decrypt(word, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }) return decrypt.toString(CryptoJS.enc.Utf8).trim() }
使用
// 引入aes.js,注意文件路徑不要出錯(cuò) import { encrypt, decrypt } from './aes' // data:需要加密的數(shù)據(jù) // encryptData:加密后的密文 // 若有需要?jiǎng)t將js對象轉(zhuǎn)換為字符串后進(jìn)行加密:JSON.stringify(data) const encryptData = encrypt(JSON.stringify(data)) // data:需要解密的密文 // decryptData:解密后的數(shù)據(jù) // 若解密結(jié)果為json字符串,則可以通過JSON.parse()方法將解密結(jié)果轉(zhuǎn)化為json對象 const decryptData = decrypt(data)
到此這篇關(guān)于js通過AES進(jìn)行加解密(ECB、CBC模式)的文章就介紹到這了,更多相關(guān)js AES加解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
變量聲明時(shí)命名與變量作為對象屬性時(shí)命名的區(qū)別解析
這篇文章主要介紹了變量聲明時(shí)命名與變量作為對象屬性時(shí)命名的區(qū)別。需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12js獲取url中的參數(shù)且參數(shù)為中文時(shí)通過js解碼
這篇文章主要介紹了url中傳遞中文參數(shù)的時(shí)候通過js解碼,需要的朋友可以參考下2014-03-03JS實(shí)現(xiàn)的base64加密解密完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)的base64加密解密,以完整實(shí)例形式分析了JavaScript基于base64編碼實(shí)現(xiàn)加密與解密的具體步驟與相關(guān)技巧,并附帶了相關(guān)的加密解密在線工具地址供大家參考,需要的朋友可以參考下2016-04-04swiper+echarts實(shí)現(xiàn)多個(gè)儀表盤左右滾動效果
這篇文章主要為大家詳細(xì)介紹了swiper+echarts實(shí)現(xiàn)多個(gè)儀表盤左右滾動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06淺談Webpack4 plugins 實(shí)現(xiàn)原理
在wabpack 核心功能除了loader應(yīng)該就是plugins插件了,本文主要介紹了Webpack4 plugins 實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09