mirror of
https://github.com/fosrl/pangolin.git
synced 2025-06-21 20:58:57 +02:00
38 lines
1 KiB
TypeScript
38 lines
1 KiB
TypeScript
|
import * as crypto from "crypto";
|
||
|
|
||
|
const ALGORITHM = "aes-256-gcm";
|
||
|
|
||
|
export function encrypt(value: string, key: string): string {
|
||
|
const iv = crypto.randomBytes(12);
|
||
|
const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
|
||
|
|
||
|
const encrypted = Buffer.concat([
|
||
|
cipher.update(value, "utf8"),
|
||
|
cipher.final()
|
||
|
]);
|
||
|
const authTag = cipher.getAuthTag();
|
||
|
|
||
|
return [
|
||
|
iv.toString("base64"),
|
||
|
encrypted.toString("base64"),
|
||
|
authTag.toString("base64")
|
||
|
].join(":");
|
||
|
}
|
||
|
|
||
|
export function decrypt(encryptedValue: string, key: string): string {
|
||
|
const [ivB64, encryptedB64, authTagB64] = encryptedValue.split(":");
|
||
|
|
||
|
const iv = Buffer.from(ivB64, "base64");
|
||
|
const encrypted = Buffer.from(encryptedB64, "base64");
|
||
|
const authTag = Buffer.from(authTagB64, "base64");
|
||
|
|
||
|
const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
|
||
|
decipher.setAuthTag(authTag);
|
||
|
|
||
|
const decrypted = Buffer.concat([
|
||
|
decipher.update(encrypted),
|
||
|
decipher.final()
|
||
|
]);
|
||
|
return decrypted.toString("utf8");
|
||
|
}
|