vue 项目AES加密 RSA签名

背景:保证信息的隐私,不被别人看到。防止信息是否被其他人篡改

思路

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-----'这种形式

你可能感兴趣的:(vue 项目AES加密 RSA签名)