UNPKG

ph-utils

Version:

js 开发工具集,前后端都可以使用(commonjs和es module)

113 lines (112 loc) 3.66 kB
import { createHash, createCipheriv, randomBytes, generateKeyPair, createDecipheriv, privateDecrypt, publicEncrypt, createHmac, } from "node:crypto"; /** * 进行 md5|sha1|sha256 数据摘要签名 * @param d 待加密的数据 * @param algorithm 签名算法, md5、sha1、sha256. Defaults to "sha256". * @param upper 返回的结果是否需要大写. Defaults to False. */ export function hashDigest(d, algorithm = "sha256", upper = false) { const hashed = createHash(algorithm).update(d).digest("hex"); return upper ? hashed.toUpperCase() : hashed; } /** * 进行 md5|sha1|sha256 数据摘要签名 * @param d 待加密的数据 * @param algorithm 签名算法, md5、sha1、sha256. Defaults to "sha256". * @param upper 返回的结果是否需要大写. Defaults to False. */ export function hash(d, algorithm = "sha256", upper = false) { return hashDigest(d, algorithm, upper); } /** * 使用 HMAC 算法对消息进行哈希处理 * @param message 待处理的消息 * @param key 用于 HMAC 算法的密钥 * @param algorithm 哈希算法,可选值为 "sha1"、"sha256" 或 "sha512",默认为 "sha256" * @param upper 返回的结果是否需要大写,默认为 false * @returns 经过 HMAC 哈希处理后的字符串 */ export function hmacHash(message, key, algorithm = "sha256", upper = false) { const hashed = createHmac(algorithm, key).update(message).digest("hex"); return upper ? hashed.toUpperCase() : hashed; } /** * 生成 RSA 签名密钥对 * @returns: [公钥, 私钥] */ export async function keyPair() { return new Promise((resolve, reject) => { generateKeyPair("rsa", { modulusLength: 2048, publicKeyEncoding: { type: "spki", format: "pem", }, privateKeyEncoding: { type: "pkcs8", format: "pem", }, }, (err, publicKey, privateKey) => { if (err == null) { resolve([publicKey, privateKey]); } else { reject(err); } }); }); } /** * AES 加密 * @param key 加密密钥 * @param input 待加密的数据 * @param upper 是否转换为大写 * @returns [加密数据, 向量] */ export function aesEncrypt(key, input, upper = false) { const iv = randomBytes(16); const cipher = createCipheriv("aes-256-cbc", Buffer.from(key, "hex"), iv); let encryptedData = cipher.update(input, "utf-8", "hex"); encryptedData += cipher.final("hex"); return [ upper === true ? encryptedData.toUpperCase() : encryptedData, iv.toString("hex"), ]; } /** * AES 解密 * @param input 加密后的数据 * @param key 密钥 * @param iv 向量 * @returns */ export function aesDecrypt(input, key, iv) { const cipher = createDecipheriv("aes-256-cbc", Buffer.from(key, "hex"), Buffer.from(iv, "hex")); let decryptedData = cipher.update(input, "hex", "utf-8"); decryptedData += cipher.final("utf-8"); return decryptedData; } /** * RSA 公钥加密 * @param input 待加密字符串 * @param publicKey 公钥 * @returns */ export function rsaEncrypt(input, publicKey) { return publicEncrypt({ key: publicKey, oaepHash: "sha256", }, Buffer.from(input)).toString("base64"); } /** * RSA 解密 * @param encrtypData RSA加密后的数据 * @param privateKey 私钥 * @returns */ export function rsaDecrypt(encrtypData, privateKey) { return privateDecrypt({ key: privateKey, oaepHash: "sha256", }, Buffer.from(encrtypData, "base64")).toString("utf-8"); }