import JSEncrypt from 'jsencrypt' import { getPublicKey } from '@/api/publicKey' import forge from 'node-forge' const privateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMFPa+v52FkSUXvcUnrGI/XzW3EpZRI0s9BCWJ3oNQmEYA5luWW5p8h0uadTIoTyYweFPdH4hveyxlwmS7oefvbIdiP+o+QIYW/R4Wjsb4Yl8MhR4PJqUE3RCy6IT9fM8ckG4kN9ECs6Ja8fQFc6/mSl5dJczzJO3k1rWMBhKJD/AgMBAAECgYEAucMakH9dWeryhrYoRHcXo4giPVJsH9ypVt4KzmOQY/7jV7KFQK3x//27UoHfUCak51sxFw9ek7UmTPM4HjikA9LkYeE7S381b4QRvFuf3L6IbMP3ywJnJ8pPr2l5SqQ00W+oKv+w/VmEsyUHr+k4Z+4ik+FheTkVWp566WbqFsECQQDjYaMcaKw3j2Zecl8T6eUe7fdaRMIzp/gcpPMfT/9rDzIQk+7ORvm1NI9AUmFv/FAlfpuAMrdL2n7p9uznWb7RAkEA2aP934kbXg5bdV0R313MrL+7WTK/qdcYxATUbMsMuWWQBoS5irrt80WCZbG48hpocJavLNjbtrjmUX3CuJBmzwJAOJg8uP10n/+ZQzjEYXh+BszEHDuw+pp8LuT/fnOy5zrJA0dO0RjpXijO3vuiNPVgHXT9z1LQPJkNrb5ACPVVgQJBALPeb4uV0bNrJDUb5RB4ghZnIxv18CcaqNIft7vuGCcFBAIPIRTBprR+RuVq+xHDt3sNXdsvom4h49+Hky1b0ksCQBBwUtVaqH6ztCtwUF1j2c/Zcrt5P/uN7IHAd44K0gIJc1+Csr3qPG+G2yoqRM8KVqLI8Z2ZYn9c+AvEE+L9OQY=' /** * @author https://github.com/zxwk1998/vue-admin-better (不想保留author可删除) * @description RSA加密 * @param data * @returns {Promise<{param: PromiseLike}|*>} */ // export async function encryptedData(data) { // let publicKey = '' // const res = await getPublicKey() // publicKey = res.data.publicKey // if (res.data.mockServer) { // publicKey = '' // } // if (publicKey == '') { // return data // } // const encrypt = new JSEncrypt() // encrypt.setPublicKey(`-----BEGIN PUBLIC KEY-----${publicKey}-----END PUBLIC KEY-----`) // data = encrypt.encrypt(JSON.stringify(data)) // return { // param: data, // } // } export async function encryptedData(data) { const res = await getPublicKey() let publicKey = res.data.publicKey if (res.data.mockServer || !publicKey) { return data } const pem = `-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----` const forgePublicKey = forge.pki.publicKeyFromPem(pem) const encrypted = forgePublicKey.encrypt(JSON.stringify(data), 'RSA-OAEP', { md: forge.md.sha256.create(), // OAEP + SHA-256 }) return { param: forge.util.encode64(encrypted), } } // export async function encryptedData(data) { // const res = await getPublicKey() // let publicKey = res.data.publicKey // if (res.data.mockServer || !publicKey) { // return data // } // // 构造 PEM 格式 // publicKey = `-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----` // // 将 PEM 公钥导入为 CryptoKey // const importedKey = await importPublicKey(publicKey) // // 加密数据 // const encodedData = new TextEncoder().encode(JSON.stringify(data)) // const encryptedBuffer = await crypto.subtle.encrypt( // { // name: 'RSA-OAEP', // }, // importedKey, // encodedData // ) // // 转 Base64 字符串,方便传输 // const base64Encrypted = btoa(String.fromCharCode(...new Uint8Array(encryptedBuffer))) // return { param: base64Encrypted } // } // // 把 PEM 格式公钥转换为 CryptoKey // async function importPublicKey(pem) { // const b64 = pem // .replace(/-----BEGIN PUBLIC KEY-----/, '') // .replace(/-----END PUBLIC KEY-----/, '') // .replace(/\s/g, '') // const binaryDer = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0)) // return crypto.subtle.importKey( // 'spki', // binaryDer.buffer, // { // name: 'RSA-OAEP', // hash: 'SHA-256', // }, // false, // ['encrypt'] // ) // } /** * @author https://github.com/zxwk1998/vue-admin-better (不想保留author可删除) * @description RSA解密 * @param data * @returns {PromiseLike} */ export function decryptedData(data) { const decrypt = new JSEncrypt() decrypt.setPrivateKey(`-----BEGIN RSA PRIVATE KEY-----${privateKey}-----END RSA PRIVATE KEY-----`) data = decrypt.decrypt(JSON.stringify(data)) return data }