淺析Node.js非對稱式加密方法,node.js加密方法
前言
剛回答了SegmentFault上一個兄弟提的問題《非對稱解密出錯》。這個屬於Node.js在安全上的應用,遇到同樣問題的人應該不少,基於回答的問題,這裡簡單總結下。
非對稱式加密的理論知識,可以參考筆者前面的文章《NODEJS進階:CRYPTO模組之理論篇》。
完整的代碼可以在 《Nodejs學習筆記》 找到,也歡迎大家關注 程式猿小卡的GitHub。
加密、解密方法
在Node.js中,負責安全的模組是crypto。非對稱式加密中,公開金鑰加密,私密金鑰解密,加解密對應的API分別如下。
加密函數:
crypto.publicEncrypt(key, buffer)
解密函數:
crypto.privateDecrypt(privateKey, buffer)
入門例子
假設有如下utils.js
// utils.jsconst crypto = require('crypto');// 加密方法exports.encrypt = (data, key) => { // 注意,第二個參數是Buffer類型 return crypto.publicEncrypt(key, Buffer.from(data));};// 解密方法exports.decrypt = (encrypted, key) => { // 注意,encrypted是Buffer類型 return crypto.privateDecrypt(key, encrypted);};
測試代碼app.js:
const utils = require('./utils');const keys = require('./keys');const plainText = '你好,我是程式猿小卡';const crypted = utils.encrypt(plainText, keys.pubKey); // 加密const decrypted = utils.decrypt(crypted, keys.privKey); // 解密console.log(decrypted.toString()); // 你好,我是程式猿小卡
附上公開金鑰、私密金鑰 keys.js:
exports.privKey = `-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDFWnl8fChyKI/Tgo1ILB+IlGr8ZECKnnO8XRDwttBbf5EmG0qV8gs0aGkh649rb75I+tMu2JSNuVj61CncL/7Ct2kAZ6CZZo1vYgtzhlFnxd4V7Ra+aIwLZaXT/h3eE+/cFsL4VAJI5wXh4Mq4Vtu7uEjeogAOgXACaIqiFyrk3wIDAQABAoGBAKdrunYlqfY2fNUVAqAAdnvaVOxqa+psw4g/d3iNzjJhBRTLwDl2TZUXImEZQeEFueqVhoROTa/xVg/r3tshiD/QC71EfmPVBjBQJJIvJUbjtZJ/O+L2WxqzSvqewzYaTm6Te3kZeG/cULNMIL+xU7XsUmslbGPAurYmHA1jNKFpAkEA48aUogSv8VFnR2QuYmilz20LkCzffK2aq2+9iSz1ZjCvo+iuFt71Y3+etWomzcZCuJ5sn0w7lcSxnqyzCFDspQJBAN3O2VdQF3gua0Q5VHmK9AvsoXLmCfRa1RiKuFOtrtC609RfX4DCFxDxH09UVu/8Hmdau8t6OFExcBriIYJQwDMCQQCZLjFDDHfuiFo2js8K62mnJ6SBH0xlIrND2+/RUuTuBov4ZUC+rM7GTUtEodDazhyM4C4Yq0HfJNp25Zm5XALpAkBGatLpO04YI3R+dkzxQUH1PyyKU6m5X9TjM7cNKcikD4wMkjK5p+S2xjYQc1AeZEYqvc187dJPRIi4oC3PN1+tAkBuW51/5vBj+zmd73mVcTt28OmSKOX6kU29F0lvEh8IoHiLOo285vG5ZtmXiY58tAiPVQXa7eU8hPQHTHWa9qp6-----END RSA PRIVATE KEY-----`;exports.pubKey = `-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFWnl8fChyKI/Tgo1ILB+IlGr8ZECKnnO8XRDwttBbf5EmG0qV8gs0aGkh649rb75I+tMu2JSNuVj61CncL/7Ct2kAZ6CZZo1vYgtzhlFnxd4V7Ra+aIwLZaXT/h3eE+/cFsL4VAJI5wXh4Mq4Vtu7uEjeogAOgXACaIqiFyrk3wIDAQAB-----END PUBLIC KEY-----`;