Files
api-client/src/utils/encrypt.js

113 lines
3.9 KiB
Vue
Raw Normal View History

2025-03-28 18:28:06 +08:00
import JSEncrypt from 'jsencrypt'
import { getPublicKey } from '@/api/publicKey'
2025-05-05 18:14:22 +08:00
import forge from 'node-forge'
2025-03-28 18:28:06 +08:00
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<ArrayBuffer>}|*>}
*/
2025-05-05 18:14:22 +08:00
// 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,
// }
// }
2025-03-28 18:28:06 +08:00
export async function encryptedData(data) {
const res = await getPublicKey()
2025-05-05 18:14:22 +08:00
let publicKey = res.data.publicKey
if (res.data.mockServer || !publicKey) {
2025-03-28 18:28:06 +08:00
return data
}
2025-05-05 18:14:22 +08:00
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
})
2025-03-28 18:28:06 +08:00
return {
2025-05-05 18:14:22 +08:00
param: forge.util.encode64(encrypted),
2025-03-28 18:28:06 +08:00
}
}
2025-05-05 18:14:22 +08:00
// 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']
// )
// }
2025-03-28 18:28:06 +08:00
/**
* @author https://github.com/zxwk1998/vue-admin-better 不想保留author可删除
* @description RSA解密
* @param data
* @returns {PromiseLike<ArrayBuffer>}
*/
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
}