Node.js範例

簡要描述

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