hejunjie-encrypted-request
Version:
一个简单的前端加密助手,与 hejunjie/encrypted-request PHP 包配合使用 | A simple encryption helper for frontend to work with hejunjie/encrypted-request PHP package
42 lines • 1.24 kB
JavaScript
import { aesEncrypt } from "./encryptor.js";
import { generateSign } from "./signer.js";
import forge from "node-forge";
/**
* 随机生成 16 字节 AES key/IV
*
* @returns { key: string, iv: string }
*/
function generateRandomKeyIv() {
const key = forge.random.getBytesSync(16);
const iv = forge.random.getBytesSync(16);
return { key, iv };
}
/**
* 用 RSA 公钥加密
*
* @param key AES Key
* @param iv AES IV
* @param pubKeyPem RSA 公钥
*
* @returns
*/
function rsaEncrypt(key, iv, pubKeyPem) {
const pubKey = forge.pki.publicKeyFromPem(pubKeyPem);
const payload = forge.util.encode64(key) + forge.util.encode64(iv);
const encrypted = pubKey.encrypt(payload, "RSA-OAEP");
return forge.util.encode64(encrypted);
}
export function encryptRequest(data, options) {
const { key, iv } = generateRandomKeyIv();
const timestamp = Math.floor(Date.now() / 1000);
const sign = generateSign(forge.util.encode64(key) + forge.util.encode64(iv), timestamp);
const en_data = aesEncrypt(data, key, iv);
const enc_payload = rsaEncrypt(key, iv, options.rsaPubKey);
return {
timestamp,
sign,
en_data,
enc_payload,
};
}
//# sourceMappingURL=index.js.map