ph-utils
Version:
js 开发工具集,前后端都可以使用(commonjs和es module)
113 lines (112 loc) • 3.66 kB
JavaScript
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");
}