淺析Node.js非對稱加密方法
前言
剛回答了SegmentFault上一個(gè)兄弟提的問題《非對稱解密出錯(cuò)》。這個(gè)屬于Node.js在安全上的應(yīng)用,遇到同樣問題的人應(yīng)該不少,基于回答的問題,這里簡單總結(jié)下。
非對稱加密的理論知識,可以參考筆者前面的文章《NODEJS進(jìn)階:CRYPTO模塊之理論篇》。
完整的代碼可以在 《Nodejs學(xué)習(xí)筆記》 找到,也歡迎大家關(guān)注 程序猿小卡的GitHub。
加密、解密方法
在Node.js中,負(fù)責(zé)安全的模塊是crypto。非對稱加密中,公鑰加密,私鑰解密,加解密對應(yīng)的API分別如下。
加密函數(shù):
crypto.publicEncrypt(key, buffer)
解密函數(shù):
crypto.privateDecrypt(privateKey, buffer)
入門例子
假設(shè)有如下utils.js
// utils.js const crypto = require('crypto'); // 加密方法 exports.encrypt = (data, key) => { // 注意,第二個(gè)參數(shù)是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+IlGr8ZECKnnO8XRDwttBbf5EmG0qV 8gs0aGkh649rb75I+tMu2JSNuVj61CncL/7Ct2kAZ6CZZo1vYgtzhlFnxd4V7Ra+ aIwLZaXT/h3eE+/cFsL4VAJI5wXh4Mq4Vtu7uEjeogAOgXACaIqiFyrk3wIDAQAB AoGBAKdrunYlqfY2fNUVAqAAdnvaVOxqa+psw4g/d3iNzjJhBRTLwDl2TZUXImEZ QeEFueqVhoROTa/xVg/r3tshiD/QC71EfmPVBjBQJJIvJUbjtZJ/O+L2WxqzSvqe wzYaTm6Te3kZeG/cULNMIL+xU7XsUmslbGPAurYmHA1jNKFpAkEA48aUogSv8VFn R2QuYmilz20LkCzffK2aq2+9iSz1ZjCvo+iuFt71Y3+etWomzcZCuJ5sn0w7lcSx nqyzCFDspQJBAN3O2VdQF3gua0Q5VHmK9AvsoXLmCfRa1RiKuFOtrtC609RfX4DC FxDxH09UVu/8Hmdau8t6OFExcBriIYJQwDMCQQCZLjFDDHfuiFo2js8K62mnJ6SB H0xlIrND2+/RUuTuBov4ZUC+rM7GTUtEodDazhyM4C4Yq0HfJNp25Zm5XALpAkBG atLpO04YI3R+dkzxQUH1PyyKU6m5X9TjM7cNKcikD4wMkjK5p+S2xjYQc1AeZEYq vc187dJPRIi4oC3PN1+tAkBuW51/5vBj+zmd73mVcTt28OmSKOX6kU29F0lvEh8I oHiLOo285vG5ZtmXiY58tAiPVQXa7eU8hPQHTHWa9qp6 -----END RSA PRIVATE KEY----- `; exports.pubKey = `-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFWnl8fChyKI/Tgo1ILB+IlGr8 ZECKnnO8XRDwttBbf5EmG0qV8gs0aGkh649rb75I+tMu2JSNuVj61CncL/7Ct2kA Z6CZZo1vYgtzhlFnxd4V7Ra+aIwLZaXT/h3eE+/cFsL4VAJI5wXh4Mq4Vtu7uEje ogAOgXACaIqiFyrk3wIDAQAB -----END PUBLIC KEY----- `;
- node.js之基礎(chǔ)加密算法模塊crypto詳解
- 淺談如何通過node.js對數(shù)據(jù)進(jìn)行MD5加密
- 使用node.js對音視頻文件加密的實(shí)例代碼
- node.JS md5加密中文與php結(jié)果不一致的解決方法
- Java與Node.js利用AES加密解密出相同結(jié)果的方法示例
- Node.js 數(shù)據(jù)加密傳輸淺析
- Node.js DES加密的簡單實(shí)現(xiàn)
- NODE.JS加密模塊CRYPTO常用方法介紹
- Node.js中AES加密和其它語言不一致問題解決辦法
- node.JS的crypto加密模塊使用方法詳解(MD5,AES,Hmac,Diffie-Hellman加密)
相關(guān)文章
nodemon實(shí)現(xiàn)Typescript項(xiàng)目熱更新的示例代碼
這篇文章主要介紹了nodemon實(shí)現(xiàn)Typescript項(xiàng)目熱更新的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11使用Node.js自動(dòng)生成帶動(dòng)態(tài)圖表的Word文檔
在現(xiàn)代軟件開發(fā)中,動(dòng)態(tài)生成?Word?文檔是一項(xiàng)非常常見的需求,本文將結(jié)合Node.js和ECharts實(shí)現(xiàn)自動(dòng)生成帶動(dòng)態(tài)圖表的Word文檔,感興趣的可以了解下2024-03-03Linux 安裝nodejs環(huán)境及路徑配置詳細(xì)步驟
大家都知道linux安裝nodejs有兩種比較常用的方法,一種解壓即可用的方法操作比較簡便,另一種方法通過編譯來安裝,本文重點(diǎn)給大家講解第一種方法,感興趣的朋友跟隨小編一起看看吧2021-11-11使用?Node.js和Express搭建服務(wù)器的過程步驟詳解
Node.js?是一個(gè)開源、跨平臺(tái)的?JavaScript?運(yùn)行時(shí)環(huán)境,這篇文章主要介紹了如何使用?Node.js和Express搭建服務(wù)器,需要的朋友可以參考下2023-09-09nodejs實(shí)現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報(bào)警聲)的方法
這篇文章主要介紹了nodejs實(shí)現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報(bào)警聲)的方法,結(jié)合實(shí)例形式分析了nodejs發(fā)出蜂鳴聲的原理及具體應(yīng)用方法,需要的朋友可以參考下2017-01-01Node.js報(bào)錯(cuò)信息Error:?Cannot?find?module?'XXX'問題及解
這篇文章主要介紹了Node.js報(bào)錯(cuò)信息Error:?Cannot?find?module?'XXX'問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10Node.js web 應(yīng)用如何封裝到Docker容器中
這篇文章主要介紹了Node.js web 應(yīng)用如何封裝到Docker容器中,幫助大家更好的學(xué)習(xí)node.js和使用docker容器,感興趣的朋友可以了解下2020-09-09