簡要描述
Node.js 版本加解密範例以及執行範例
加解密範例
需載入 Node.js 加密模組
複製const crypto = require("crypto");
AES-GCM 加密範例
複製/**
* @param {string} plaintext - 要加密的參數
* @param {string} key - 加密 Key
* @param {Buffer} iv - 初始化向量 iv
* @returns {Buffer} - 加密結果
*/
function encrypt(plaintext, key, iv) {
const cipher = crypto.createCipheriv("aes-256-gcm",key, iv);
let cipherText = cipher.update(plaintext, "utf8", "base64");
cipherText += cipher.final("base64");
const tag = cipher.getAuthTag().toString("base64");
return Buffer.from(`${cipherText}:::${tag}`).toString("hex").trim();
}
AES-GCM 解密
複製/**
* @param {string} encryptStr - 要解密的參數
* @param {string} key - 加密 Key
* @param {Buffer} iv - 初始化向量 iv
* @returns {string} - 解密結果
*/
function decrypt(encryptStr, key, iv) {
const [encryptData, tag] = Buffer.from(encryptStr, "hex").toString().split(":::");
const decipher = crypto.createDecipheriv("aes-256-gcm", key, iv);
decipher.setAuthTag(Buffer.from(tag, "base64"));
let decipherText = decipher.update(encryptData, "base64", "utf8");
decipherText += decipher.final("utf8");
return decipherText;
}
SHA256 加密
複製/**
* @param {string} encryptStr - 加密過後的參數
* @param {string} key - 加密 Key
* @param {Buffer} iv - 初始化向量 iv
* @returns {string} - hash 結果的字串,16進制且皆為大寫
*/
function sha256 (encryptStr, key, iv) {
const hash = crypto.createHash("sha256").update(`${key}${encryptStr}${iv}`);
return hash.digest("hex").toUpperCase();
}
執行範例
模擬商店資料
複製const merData = {
MerID: "AAA",
MerTradeNO: "BBB",
Prod: "商品說明"
}
將字串轉成 Query String
複製const querystring = require("querystring");
const plaintext = querystring.stringify(merData);
const merKey = "12345678901234567890123456789012"
AES-GCM 傳入的 iv 必須為 Buffer 格式
複製const merIv = Buffer.from("1234567890123456");
執行加解密以及 SHA256
複製const getEncrypt = encrypt(plaintext, merKey, merIv)
const getDecrypt = decrypt(getEncrypt, merKey, merIv)
const getSha256 = sha256(getEncrypt, merKey, merIv)
使用相同模擬商店資料應可得
複製// AES-GCM 加密結果
47396636346f66735853533167396942344f587a3775696b34732b596e70452b675270564f73536b7753446c6a4d77526d4e374256514173672b6c78616d4533504d475152642b362f4530626f446e4f6356533969756c743a3a3a4b5961342f4635456965743069385a784b6277704a413d3d
// AES-GSM 解密結果
MerID=AAA&MerTradeNO=BBB&Prod=%E5%95%86%E5%93%81%E8%AA%AA%E6%98%8E
// SHA256
E97180D78C8378D64A188D292938B9D2717034F292B626019B01DF160AEFC0B7