导读
为了数据传输的安全可靠,常常在前端会将数据(明文)进行加密保护后,再传输给后端进行数据处理,在接收数据时往往也是密文接收,前端解密后进行数据呈现。
【crypto-js】插件包含有对称加密(DES、AES),哈希算法(MD5、SHA 、HMAC),流式加密(RC4、Rabbit)。项目运用最多的就是对称加解密,所谓对称加解密就是密钥key是一样的,加密的key和解密的key一致。此篇主要记录DES的使用;AES加解密在下一篇。
安装
npm i crypto-js
引入
import CryptoJS from 'crypto-js'
CryptoJS 公共类
1、enc 指定字符编码模式
包含8个API: “Hex”,“Latin1”,“Utf8”,“Utf16BE”, “Utf16”, “Utf16LE”,“Base64”,“Base64url”
常用的CryptoJS.enc.Utf8 ,指定Utf-8编码
console.log(Object.keys(CryptoJS.enc))
2、mode 模式
包含 “CBC”,“CFB”, “CTR”,“CTRGladman”,“OFB”, “ECB”,这些模式可以选择,那主要是看后端加解密的模式是咋样的,跟后端保持一致。
ECB 密钥的固定长度为128位,固定的明文生成固定的密文,安全性低。
CBC 密钥的固定长度256位,并且需要一个16字节的IV偏移量保证相同的明文每次生成的密文不一样,安全性高。
3、pad 模式
“Pkcs7”, “AnsiX923”, “Iso10126”, “Iso97971”, “ZeroPadding”,“NoPadding”
跟后端加解密保持一致。
4、iv偏移量
CipherOption里面的属性,mode== ECB时,不需要iv。
5、DES加密
比较老旧的一种加密方式,有56位密钥长度,密钥长度较短,安全性逐渐变弱。
加密函数
DES/CBC/PK7 方式加密
var defKey = '自定义密钥'
encrypt(message, keyStr) {
//加密(密码)
keyStr = keyStr ? keyStr : defKey
let key = CryptoJS.enc.Utf8.parse(keyStr) // 密钥
let iv = CryptoJS.enc.Utf8.parse(keyStr) // 偏移量
let srcs = CryptoJS.enc.Utf8.parse(JSON.stringify(message)) // message明文,待加密的字符串
// DES/CBC/PK7
let encrypted = CryptoJS.DES.encrypt(srcs, key, { mode: CryptoJS.mode.CBC, iv: iv, padding: CryptoJS.pad.Pkcs7 })
return encrypted.ciphertext.toString()
},
解密函数
decrypt(message, keyStr) {
//解密(密码)
keyStr = keyStr ? keyStr : defKey
let key = CryptoJS.enc.Utf8.parse(keyStr)
let iv = CryptoJS.enc.Utf8.parse(keyStr)
let srcs = CryptoJS.enc.Hex.parse(message)
let decrypt = CryptoJS.DES.decrypt({ ciphertext: srcs }, key, {
mode: CryptoJS.mode.CBC,
iv: iv,
padding: CryptoJS.pad.Pkcs7,
})
return decrypt.toString(CryptoJS.enc.Utf8)
},
应用
import { encrypt, decrypt} from '@/utils/des.js'
let _param = ref('hello des')
console.log('加密了:', encrypt(_param.value, '11111111')) //加密了: 43eb2b0bc56132543ac100140a79590b
console.log('解密了:', decrypt('43eb2b0bc56132543ac100140a79590b', '11111111')) // 解密了: "hello des"
版权归原作者 不吃香菜的蟹老板 所有, 如有侵权,请联系我们删除。