nodejs版本RSA演算法封裝(SHA1)

故事背景

看到沒寫過程式碼的人聊演算法細節裝X,真的感覺非常逗,又不好意思戳破人家的表演,放到古代很可能就是趙括,能代替廉頗攻秦~

哈哈,貌似說多了,還是傳說中的PUK項目,不僅有一個獨特的加密數據方法DESede/CBC/PKCS5Padding,還加了一層RSA簽名(非對稱加密),雙重加密保障,安全係數5顆星!

普及一下非對稱加密,簡單地說就是

甲方用自己的【私鑰】對機密資訊進行加密發送給乙方,乙方再用甲方的【公鑰】對甲方發送的數據進行驗簽。

Talk is cheap,show you the code !

核心程式碼

const crypto = require("crypto");

/**
 * 創建簽名(使用私鑰和數據)
 *
 * @param data
 * @param privateKey
 * @returns {string}
 */
function createSign(data, privateKey) {
    const sign = crypto.createSign('RSA-SHA1');
    sign.update(data);
    sign.end();
    return sign.sign(privateKey).toString('base64')
}

/**
 * 簽名驗證(使用公鑰、數據、簽名)
 *
 * @param data
 * @param sign
 * @param publicKey
 * @returns {boolean}
 */
function verifySign(data, sign, publicKey) {
    const verify = crypto.createVerify('RSA-SHA1');
    verify.update(data);
    verify.end();
    return verify.verify(publicKey, Buffer.from(sign, 'base64'));
}

運行結果

注意,需要生成對應的公鑰和私鑰,可以使用openssl,也可以使用支付寶的開放工具

//使用公鑰加密數據
const privateKey = `-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIzOypoBDOR0dLfR8gEdcHMuX97+Qms/KQ7tbsKzC/rbvJ0p3r9Dy5hTzSBR+BpFYDMJD9nnbDFZF7vg5hletPJoD7rN52DqBL3oMPLYN3u2qVRFIMnk0Oy2lBgAZ52VRcZNu5oYQlCvD+vztf7UCpcL2gP6A9zts4bj553N4gUVAgMBAAECgYAgvuKdCAuAgZi3OwrluXvyPWGsUUMO/+RDhXIRs2Pg1gM6JYeYwWJyrWJx1r41Fdc2ZzAZg9lEbKy5U6cPVVgNAwE8m4AHVNVlZJVvx0lGnvnh3XFlCrlKv/FseDQhi52vysVjIy1BDDWEUSnMcjfkwncjEBdzTLFqjbLiLinNwQJBAM9oTJM8j1K0N2qQfRsyRhUxJI+C4MDntK8CGqx0Qvf90dgXNM8FEVxsjDdN/nIMNeRYgXhrBSe+qlequSHtNeUCQQCtzAmNt3yANOymMaU19NWMf6WVeu5/GGBWgyarzffv/A9k16TrcHlMLcEC97ixmtNEB1ItkiJmJv7tzZmFpJ9xAkEAkwPFM6B7nw3rMfgVFc/+6UqaNbd5hIM5CcweCBuo1Ivv0JIydoOLGM5AXXtFXqXVFXS+4RJK5y85I0b6T1gLGQJARla51x1XyhuhW3HkR34bn41Z2rGyLMYU126lDAuEOSBuqoWMPa17qhUqdKUFnvvmXTYJUGBAg89shZocdDY4QQJBAME5svM/2FIuNDU2uqf4/yv32PHH11F9zez16nJFleagTYU6Lt1Hwcw39JyyxHUqOyKdXr/EncGv6zJgldPULbM=
-----END PRIVATE KEY-----`;
let json = `{"name":"chenqionghe","cn":"雪山飛豬","content":"no pain no gain, light weight baby"}`;
let sign = createSign(json, privateKey);
console.log(sign);

//使用公鑰驗證簽名
const publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMzsqaAQzkdHS30fIBHXBzLl/e/kJrPykO7W7Cswv627ydKd6/Q8uYU80gUfgaRWAzCQ/Z52wxWRe74OYZXrTyaA+6zedg6gS96DDy2Dd7tqlURSDJ5NDstpQYAGedlUXGTbuaGEJQrw/r87X+1AqXC9oD+gPc7bOG4+edzeIFFQIDAQAB
-----END PUBLIC KEY-----`;
console.log(verifySign(json, sign, publicKey));

運行輸出

QPLXzRwQ8OFUn0S4c3+WaKO64uK6boQRTH1EAYS00Rh9br3so+ucX2KaIa3F0QZ5REkH96dEbCMWi/s0xAncCrnxKHjm43r2uybWE8qgBr8zVKOPTqwdIAEjIjPwSe8cRb4IAXJkPv6u7x+Qbw+tYrm0L3zvgitKeCl5PNdcEdo=
true

結果為true,驗證通過,演算法沒問題,以上內容為chenqionghe踩坑封裝,轉載請申明地址~

Tags: