加密方式:AES加密,RSA加密
加密方案一:使用RSA加密向后端传输数据,再使用AES对后端的数据进行解密进行非对称加密
加密方案二:前端使用RSA验签,成功之后再使用AES进行参数的加密和解密的对称加密,
加密过程中常见的问题
加密方案二:
流程图:
1.前端生成自己的公钥和私钥
npm install jsrsasign
2.在建立一个公共文件,如src/utils/jsrsasign.js
import jsrsasign from 'jsrsasign'
export function getRsaKeys() {
var rsaKeypair = jsrsasign.KEYUTIL.generateKeypair("RSA", 500);//数字500控制生成的密钥的长短,密钥越长,消耗的时间越长
var PRIVATE = jsrsasign.KEYUTIL.getPEM(rsaKeypair.prvKeyObj, "PKCS8PRV");//公钥
var PUBLIC = jsrsasign.KEYUTIL.getPEM(rsaKeypair.pubKeyObj);//私钥
let data = {
clientPublicKey: (PUBLIC.substring(28, PUBLIC.length - 28).replace(/\r\n/g, '')).replace(/\n/g, ''),
clientPrivateKey: PRIVATE.substring(28, PRIVATE.length - 28).replace(/\r\n/g, '')
}
consolo.log(data)//处理之后的公钥和私钥
return data
}
3.请求获取到后端的公钥,把后端的公钥(servicePublicKey)作为加密的钥匙把前端的公钥(clientPublicKey)加密后,把加密后的clientPublicKey作为参数发给后端,后端返回一个加密的钥匙(servicePrivateKey),这个servicePrivateKey用来让AES对参数的加密解密。
import jsrsasign from 'jsrsasign'
import JSEncrypt from 'jsencrypt'
import {
getServiceKey,
deliverClientKey
} from '@/api/login.js'
import Encrypt from 'encryptlong' // encryptlong是基于jsencrypt扩展的长文本分段加解密功能。
export function getRsaKeys() {
var rsaKeypair = jsrsasign.KEYUTIL.generateKeypair("RSA", 2048);//数字可以改小一点
var PRIVATE = jsrsasign.KEYUTIL.getPEM(rsaKeypair.prvKeyObj, "PKCS8PRV");
var PUBLIC = jsrsasign.KEYUTIL.getPEM(rsaKeypair.pubKeyObj);
let data = {
clientPublicKey: (PUBLIC.substring(28, PUBLIC.length - 28).replace(/\r\n/g, '')).replace(/\n/g,''),
clientPrivateKey: PRIVATE.substring(28, PRIVATE.length - 28).replace(/\r\n/g, '')
}//去掉里面的换行符号,得到前端的公私钥
getServiceKey().then(res => { //第一遍获取到后端的servicePublicKey
const PUBLIC_KEY = res.datas.publicKey
var encryptor = new Encrypt()
encryptor.setPublicKey(PUBLIC_KEY)
let result = encryptor.encryptLong(data.clientPublicKey)
//获取到的servicePublicKey作为钥匙加密前端的clientPublicKey,发给后端
deliverClientKey({
jsPublicKey: result
}).then(Response => {
//拿到后端加密的servicePrivateKey,对其进行解密
var jsencrypt = new JSEncrypt()
jsencrypt.setPrivateKey(data.clientPrivateKey)
var result = jsencrypt.decrypt(Response.datas.encryptKey)
console.log(result, '解密27');//拿到最终的钥匙,用这个去进行AES对称加解密
})
})
}