使用AES加密进行前端加、解密

2,604 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

什么是AES对称加密?

1、aes对称加密是最快速、简单的一种加密方式,加密(encryption)、解密(decryption)使用的是同一套密钥(secret key);
2、aes(advanced Encryption standard)高级加密标准,是最常见的对称加密算法(微信小程序的加密传输就是用的这套加密算法),简而言之,对称加密就是加密解密使用的是同一套密钥,适用于经常发送数据的场合;
3、非对称加密:加密和解密的密钥是不相同的,通常加密的速度比较慢,适合偶尔发送数据的场合;

20170219082909688.png

1、安装crypto-js

npm install --save crypto-js

2、引入crypto-js

import CryptoJS from 'crypto-js'

3、在util文件夹中新建AES.js文件,添加代码

import CryptoJS from 'crypto-js'
export default {
    // 加密
    encrypt(key , iv , data){
        if( typeof data === "object" ){
            // 如果传入的data是json对象,先转义为json字符串
            try {
                data = JSON.stringify(data)
            } catch (error) {
                console.log("error:",error)
            }
        }
         // 统一将传入的字符串转成UTF8编码
        const dataHex = CryptoJS.enc.Utf8.parse( data ) // 需要加密的数据
        const keyHex = CryptoJS.enc.Utf8.parse( key ) // 秘钥
        const ivHex = CryptoJS.enc.Utf8.parse( iv ) // 偏移量
        const encrypted = CryptoJS.AES.encrypt( dataHex , keyHex , {
          iv: ivHex,
          mode: CryptoJS.mode.CBC, // 加密模式
          padding: CryptoJS.pad.Pkcs7
        })
        let encryptedVal = encrypted.ciphertext.toString()
        return encryptedVal //  返回加密后的值
	},
    
    // 解密
    decrypt( key , iv , encryptedVal ) {
    /*
      传入的key和iv需要和加密时候传入的key一致  
    */
     // 统一将传入的字符串转成UTF8编码
        let encryptedHexStr = CryptoJS.enc.Hex.parse( encryptedVal  );
        let srcs = CryptoJS.enc.Base64.stringify( encryptedHexStr );
        const keyHex = CryptoJS.enc.Utf8.parse( key ) // 秘钥
        const ivHex = CryptoJS.enc.Utf8.parse( iv ) // 偏移量
        let decrypt = CryptoJS.AES.decrypt( srcs , keyHex , {
            iv: ivHex, 
            mode: CryptoJS.mode.CBC, 
            padding: CryptoJS.pad.Pkcs7
        });
        let decryptedStr = decrypt.toString( CryptoJS.enc.Utf8 );
        return decryptedStr.toString();
    }
}

4.使用的时候:

 import { encrypt,decrypt } from '@/utils/crypto' 进行导入