Files
api-client/src/utils/encrypt.js
2025-05-05 18:14:22 +08:00

113 lines
3.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<ArrayBuffer>}|*>}
*/
// 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<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
}