vue前后端简单的安全加密处理

---------------------------------首先是插件选择

需要前后端解密思路一致 :

前端用单向密钥加密--后端用单向密钥解密

后端用双向密钥加密--前端用双向密钥解密


单向加密的作用:对对称加密的密钥串进行加密处理,对传递后端的数据进行加密处理

对称密钥的作用:对数据加密后传递后端,保持传递和渲染的时候数据不一致

前端生成对称加密密钥串(此时前端存储了对称解密密钥)

然后用单向加密对对称加密密钥串进行加密(用公钥加密的对密钥)

携带好生成的加密密钥串传给后台(后台进行私钥密钥串解析成对称密钥)

前端使用单向加密方法,加密数据后带给后端

后端进行单向解数据和双向密钥后,后端再使用双向密钥串进行加密传给前端

前端用双向解密解密,pass

"encryptlong": "^3.1.4",

"jsencrypt": "^3.2.1",

"crypto-js": "^4.1.1",

----------------------------------配置文件 rsa.js

/* 产引入jsencrypt实现数据RSA加密 */

import JSEncrypt from 'jsencrypt' // 处理长文本数据时报错 jsencrypt.js Message too long for RSA

/* 产引入encryptlong实现数据RSA加密 */

import Encrypt from 'encryptlong' // encryptlong是基于jsencrypt扩展的长文本分段加解密功能。

// 存储加密公钥密钥串

const publicKey = `12d5a6d4as65d1as23d1a3d4as5d64a3d21a3d245f4dsv1gfd3h15ut6i1y21jugh3km1i56uo1`

export default {

  /* JSEncrypt加密 */

  rsaPublicData(data) {

    var jsencrypt = new JSEncrypt()

    jsencrypt.setPublicKey(publicKey)

    // 如果是对象/数组的话,需要先JSON.stringify转换成字符串

    var result = jsencrypt.encrypt(data)

    return result

  },

  /* JSEncrypt解密 */

  rsaPrivateData(data) {

    var jsencrypt = new JSEncrypt()

    jsencrypt.setPrivateKey(publicKey)

    // 如果是对象/数组的话,需要先JSON.stringify转换成字符串

    var result = jsencrypt.encrypt(data)

    return result

  },

  /* 加密 */

  encrypt(data) {

    var encryptor = new Encrypt()

    encryptor.setPublicKey(publicKey)

    // 如果是对象/数组的话,需要先JSON.stringify转换成字符串

    const result = encryptor.encryptLong(data)

    return result

  },

  /* 解密 - PRIVATE_KEY - 验证 */

  decrypt(data) {

    var encryptor = new Encrypt()

    encryptor.setPrivateKey(publicKey)

    // 如果是对象/数组的话,需要先JSON.stringify转换成字符串

    var result = encryptor.decryptLong(data)

    return result

  }

}

-------------------------------------配置aes.js

import CryptoJS from "crypto-js";

/**

* CryptoJS AES 加密。str 是需要加密的字符串明文;key 是密钥;iv 是偏移向量,默认 iv 是 16 个 0(这个称为初始化向量),我们可以指定 iv 来进行加解密,加大破解难度;返回值为加密结果字符串密文

*

* @param {String} str

* @param {String} key

* @param {String} iv

* @return {String}

*/

const key = getKey(16)

function aesEncrypt(str) {

  const formatedKey = CryptoJS.enc.Utf8.parse(key) // 将 key 转为 128bit 格式

  const encrypted = CryptoJS.AES.encrypt(str, formatedKey, { mode: CryptoJS.mode.ECB }) // 加密,使用CryptoJS的ECB加密方式进行密钥加密

  return encrypted.toString() // AES 加密生成的密文是一个对象,如果直接将其转为字符串是一个 Base64 编码串,在 encrypted.ciphertext 上的属性转为字符串才是后端需要的密文格式

}

/**

* CryptoJS AES 解密。encryptedStr 字符串密文;key 是密钥;iv 是偏移量;返回结果为解密后的结果明文

* 注意:key 与 iv 要与上面加密使用的 key 与 iv 保持一致

*

* @param {String} encryptedStr

* @param {String} key

* @param {String} iv

* @return {String}

*/

function aesDecrypt(encryptedStr, dummy) {

  // const encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr) // 把密文由 128 bit 转为十六进制

  // const encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr) // 再转为 Base64 编码的字符串

  const formatedKey = CryptoJS.enc.Utf8.parse(dummy || key) // 将 key 转为 128bit 格式

  const decryptedData = CryptoJS.AES.decrypt(encryptedStr, formatedKey, { mode: CryptoJS.mode.ECB }) // 解密

  return decryptedData.toString(CryptoJS.enc.Utf8) // 经过 AES 解密后,依然是一个对象,将其变成明文就需要按照 Utf8 格式转为字符串

}

/**

* 生成密钥

* @param n 生成多少位的密钥(默认8位)

*/

function getKey(n) {

  let chars = [

    "0",

    "1",

    "2",

    "3",

    "4",

    "5",

    "6",

    "7",

    "8",

    "9",

    "A",

    "B",

    "C",

    "D",

    "E",

    "F",

    "G",

    "H",

    "I",

    "J",

    "K",

    "L",

    "M",

    "N",

    "O",

    "P",

    "Q",

    "R",

    "S",

    "T",

    "U",

    "V",

    "W",

    "X",

    "Y",

    "Z",

  ];

  if (n == null) {

    n = 8;

  }

  let res = "";

  for (let i = 0; i < n; i++) {

    let id = Math.ceil(Math.random() * 35);

    res += chars[id];

  }

  return res;

}

export default {

  key,

  aesDecrypt,

  aesEncrypt,

};

---------------------------组件使用方法

import AES from "@/utils/aes.js"

import RSA from "@/utils/rsa.js"

接口传输:我们将生成的双向密钥加密传发送给后端,携带在formdata中

加密的数据操作

                request.phoneNumber = RSA.encrypt(this.InformationList.phonenumber)

                request.email = RSA.encrypt(this.InformationList.Email)

await this.$http.getparams({ ...this.form,dummy: RSA.encrypt(AES.key) }).then()

展示解密数据

                phonenumber:AES.aesDecrypt(data.phoneNumbe, this.dummy),

                email:!res.email ? "" :AES.aesDecrypt(data.email, this.dummy)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349