赞
踩
业务需求: 由于公司项目为了确保数据传输的安全性,防止别人的抓包和数据泄露,需要对敏感数据进行加密传输。
实现思路: 使用CryptoJS实现对称加密解密。
crypto-js
import CryptoJS from 'crypto-js'
// const CryptoJS = require('crypto-js')
CryptoJS.AES
,CryptoJS.AES.encrypt加密、CryptoJS.AES.decrypt解密:
附上官网文档链接
由于对称加密使用AES-128-CBC算法,采用的PKCS7填充的,因此密钥key的长度为16位。下面示例使用CryptoJS.mode.CBC和CryptoJS.pad.Pkcs7
const CryptoJS = require('crypto-js') // AES对称加密 export function encryptionValue(value, key = 'thanks66', iv = 'thanks88') { value = value.toString() // 数字加密会报错,转成字符串 // value = CryptoJS.enc.Utf8.parse(value) key = CryptoJS.enc.Utf8.parse(key) iv = CryptoJS.enc.Utf8.parse(iv) // key = CryptoJS.enc.Latin1.parse(key) // iv = CryptoJS.enc.Latin1.parse(iv) const encrypted = CryptoJS.AES.encrypt(value, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString() } // AES对称解密 export function decryptionValue(value, key = 'thanks66', iv = 'thanks88') { // value = CryptoJS.enc.Utf8.parse(value) key = CryptoJS.enc.Utf8.parse(key) iv = CryptoJS.enc.Utf8.parse(iv) // key = CryptoJS.enc.Latin1.parse(key) // iv = CryptoJS.enc.Latin1.parse(iv) const decrypt = CryptoJS.AES.decrypt(value, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return decrypt.toString(CryptoJS.enc.Utf8) }
console.log('2===', phone);
const phone1 = encryptionValue(phone)
console.log('加密===', encryptionValue(phone));
console.log('解密===', decryptionValue(phone1));
加密解密结果:
使用iv: key
,同一个字符串多次加密,保持加密值不变。
加密解密结果:
encrypted.ciphertext 形式的加密结果怎么解密呢?
const CryptoJS = require('crypto-js') // AES对称加密 export function encryptionValue(value, key = 'thanks66', iv = 'thanks88') { value = value.toString() // 数字加密会报错,转成字符串 // value = CryptoJS.enc.Utf8.parse(value) key = CryptoJS.enc.Utf8.parse(key) iv = CryptoJS.enc.Utf8.parse(iv) // key = CryptoJS.enc.Latin1.parse(key) // iv = CryptoJS.enc.Latin1.parse(iv) const encrypted = CryptoJS.AES.encrypt(value, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.ciphertext.toString() } // AES对称解密 export function decryptionValue(value, key = 'thanks66', iv = 'thanks88') { // value = CryptoJS.enc.Utf8.parse(value) key = CryptoJS.enc.Utf8.parse(key) iv = CryptoJS.enc.Utf8.parse(iv) // key = CryptoJS.enc.Latin1.parse(key) // iv = CryptoJS.enc.Latin1.parse(iv) const encryptedHexStr = CryptoJS.enc.Hex.parse(value); const srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); const decrypt = CryptoJS.AES.decrypt(srcs, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return decrypt.toString(CryptoJS.enc.Utf8) }
注意:前后端的密钥、偏移量、加密模式、填充方式和编码格式等需保持一致。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。