vue 项目AES加密 RSA签名
2022-07-21 本文已影响0人
jia林
背景:保证信息的隐私,不被别人看到。防止信息是否被其他人篡改
思路
1.使用AES加密
- 前端随机生成16位字符串,使用后端的公钥对AES的密钥进行RSA加密
- 所有请求参数进行AES加密
2.使用RSA进行签名
代码实现
import CryptoJS from 'crypto-js'
import { JSEncrypt } from 'jsencrypt'
import jsrsasign, { KJUR } from 'jsrsasign'
export const PUBLIC_KEY = "加密的公钥";
export const PRIVATE_KEY = "签名的私钥";
/**
* 随机生成16位的AES密钥
*/
function getKeyAES() {
const key = []
for (let i = 0; i < 16; i++) {
const num = Math.floor(Math.random() * 26)
const charStr = String.fromCharCode(97 + num)
key.push(charStr.toUpperCase())
}
const result = key.join('')
return result
}
/**
* AES加密
* @param data 需要加密的数据
* @param key 密钥
* @returns 加密后的数据
*/
function encodeAES(data, key) {
if (typeof data !== 'string') {
data = JSON.stringify(data)
}
const _key = CryptoJS.enc.Utf8.parse(key)
const srcs = CryptoJS.enc.Utf8.parse(data)
const encrypted = CryptoJS.AES.encrypt(srcs, _key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString();
}
/**
* RSA加密
* @param data 需要加密的数据
* @param key 密钥
* @returns 加密后的数据
*/
function encodeRSA(data, key) {
const encryptTool = new JSEncrypt()
encryptTool.setPublicKey(key)
return encryptTool.encrypt(data)
}
/**
* 签名
* @param data 需要签名的数据
* @param key 签名的密钥
*/
function signature(data, key) {
var signPrivateKey = '-----BEGIN PRIVATE KEY-----' + key+ '-----END PRIVATE KEY-----';
let sig = new KJUR.crypto.Signature({ "alg": "SHA1withRSA" });
sig.init(signPrivateKey);//初始化实例
sig.updateString(data)//更新签名数据
let sign = jsrsasign.hextob64(sig.sign())
return sign
}
export default {
RSA_KEY: PUBLIC_KEY, // RSA公钥
secret: PRIVATE_KEY, // 私钥,用于防止别人冒充签名
AES_KEY: getKeyAES(), // AES密钥,在前端生成
/**
* 加密
* @param data 接口请求参数
* 说明:请求参数data + 公共参数、AES加密、RSA加密、签名
*/
encode(data) {
const { secret, AES_KEY, RSA_KEY } = this
const security_key = encodeRSA(AES_KEY, RSA_KEY) // AES的密钥进行RSA加密
const security_key_data_packet = encodeAES(data,AES_KEY) // 所有请求参数进行AES加密
const sign_data = signature(data,secret) // 签名
const result = {
sign_data,
security_key,
security_key_data_packet
}
return result
},
}
备注:RSA签名使用的私钥一定要'-----BEGIN PRIVATE KEY-----' + key+ '-----END PRIVATE KEY-----'这种形式