前端常用的加密和解密

209 阅读3分钟

一、非对称加密(RSA)----常用

1.安装jsencrypt:npm i jsencrypt

2.新建jsencrypt.js文件

 import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'

// 密钥对生成 http://web.chacuo.net/netrsakeypair
//公钥
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
  'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='

const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
  '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
  'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
  'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
  'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
  'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
  'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
  'UP8iWi1Qw0Y='

// 加密
export function encrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPublicKey(publicKey) // 设置公钥
  return encryptor.encrypt(txt) // 对数据进行加密
}

// 解密
export function decrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPrivateKey(privateKey) // 设置私钥
  return encryptor.decrypt(txt) // 对数据进行解密
}

3.在使用页面引入js文件

import { encrypt, decrypt } from '@/common/utils/jsencrypt'

4.将需要的数据进行加密即可

this.login.password = encrypt(this.login.password)

二、对称加密算法

1、js-md5
js-md5准确来说不算是加密,应该说是将密文序列化了,可以通过下列的网站将md5加密后的字符直接解析出来,因此安全性很低 www.cmd5.com/

npm install js-md5

const md5 = require('js-md5');
function md5Encryption(pwd){
  return md5(pwd) 
}
console.log(md5Encryption('abc123')); //e99a18c428cb38d5f260853678922e03

2、crypto

npm install crypto

加入随机密钥后,安全性上比之MD5提高了很多,通过上面的解密网站已经解密不出来了

'use strict'
const crypto  = require('crypto');
// 加密
function encryption(message){
  // 初始化数据
  const key = crypto.randomBytes(32) //32位随机共享密钥
  const iv = crypto.randomBytes(16); //初始向量,16字节
  const algorithm = 'aes-256-gcm'; //加密算法和操作模式
  const text = String(message); //将需要加密的数据转成字符串
  //初始化加密算法
  const cipher = crypto.createCipheriv(algorithm,key,iv); //传入创建密钥所需参数
  let encrypted = cipher.update(text,'utf8','hex'); // 初始化加密密文
  encrypted += cipher.final('hex') //加密密文
  const tag = cipher.getAuthTag() //生成标签,用于验证密文的来源
  return [encrypted,tag,key,iv,algorithm] //返回加密密文和密文来源信息
}
// 解密
function decrypt(cipherTextList){
  const [encrypted,tag,key,iv,algorithm] = cipherTextList //导入解密内容和解密需要用到的密钥
  const decipher = crypto.createDecipheriv(algorithm,key,iv)
  decipher.setAuthTag(tag) //传入验证标签,验证密文来源,当验证标签不一致时代码报错
  let decrypted = decipher.update(encrypted,'hex','utf8');
  decrypted += decipher.final('utf8')
  return decrypted
}

let ciphered = encryption(1234556344) //加密后返回密文数组
let cipher = decrypt(ciphered) //解密后返回解密密文
console.log(ciphered[0])  // 628e1b71ae1d27ef5e01
console.log(cipher); // 1234556344

3、crypto-js(常用)

npm install crypto-js

通过自定义的密钥进行加解密,可以更灵活的加解密密文,但是因为密文的key在可以通过前端看到,所以加密的信息虽然通过解密网站无法解密,但是可以通过在前端得到的公共key进行解密

const CryptoJS  = require('crypto-js');
//aseKey为密钥(必须为:8/16/32位),message为要加密的密文
// crypto-js加密
function cryptoEncryption(aseKey,message){ 
  var encrypt = CryptoJS.AES.encrypt(message,CryptoJS.enc.Utf8.parse(aseKey),{
    mode:CryptoJS.mode.ECB,
    padding:CryptoJS.pad.Pkcs7
  }).toString();
  return encrypt
}
// crypto-js解密
function cryptoDecrypt(aseKey,message){
  var decrypt = CryptoJS.AES.decrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  }).toString(CryptoJS.enc.Utf8);
  return decrypt
}

var aseKey = "12345678" //密钥一致才能进行解密     
var encrpytText = "abc12345";
var decryptText = 'KLqoT18E3l+OoDFLwS8DsA=='
console.log(cryptoEncryption(aseKey,encrpytText)); //调用加密方法
console.log(cryptoDecrypt(aseKey,decryptText));//调用解密方法