前端接口加密(二)使用jsrsasign验签成功之后,再AES对称加密

加密方式: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对称加解密
        })
    })
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值