1.安裝openss
直接下載window下的安裝包
http://houjixin.blog.163.com/blog/static/3562841020144143494875/
以我發博文現在的例子說明,大家都是64位操作系統吧。
選擇最新版本的win64版本,體積更大的33MB的安裝程序下載安裝吧
選擇安裝目錄傻瓜安裝下一步下一步一直到完成
2.生成RSA密鑰文件 我安裝到了C:\OpenSSL-Win64下 到C:\OpenSSL-Win64\bin目錄下點擊openssl.exe
啟動后輸入genrsa -out rsa_private_key.pem 1024 回車
此時,我們可以在bin文件夾中看到一個文件名為rsa_private_key.pem的文件,用記事本方式打開它,可以看到-----BEGIN RSA PRIVATE KEY-----開頭,-----END RSA PRIVATE KEY-----結尾的沒有換行的字符串,這個就是原始的私鑰。
3.把RSA私鑰轉換成PKCS8格式
使用cmd cd到目錄去執行命令 ,調整cmd命令框的寬度,為什么不直接點openssl.exe 我下面說
輸入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt,並回車
得到生成功的結果,這個結果就是PKCS8格式的私鑰
(如果上面不用cmd中執行openssl.exe,你會發現無法復制完整轉換后的文件)
右鍵點擊openssl窗口上邊邊緣,選擇編輯→標記,選中要復制的文字(如上圖),
此時繼續右鍵點擊openssl窗口上邊邊緣,選擇編輯→復制,
把復制的內容粘土進一個新的記事本中,重命名為rsa_private.key文件,只要知道這個是PKCS8格式的私鑰即可
4.生成公鑰
輸入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,並回車,
得到生成成功的結果,如下圖:
5.node.js實例,使用了第三方庫node-rsa
var NodeRSA = require('node-rsa'); var fs= require('fs'); var onerror =(e) =>{ console.log("解密失敗"); } var onfinally =() =>{ console.log("最終做什么"); } fs.readFile('rsa_private.key','utf-8',function(err,data){ if(err){ console.log(data); }else{ console.log(data); privatekey= new NodeRSA(data); var text = 'Hello RSA!'; var encrypted = privatekey.encrypt(text, 'base64'); console.log('加密encrypted: ', encrypted); var decrypted = privatekey.decrypt(encrypted, 'utf8'); console.log('解密decrypted: ', decrypted); var encrypted1 ='mIJocRfF+MWS3J6+fkPSM9ZAMSZhXxHC+/w0UuT+t6ZmLnoamQ6WKwOBPQ+o+mazk61MFdyImWVW+51dYLc7kE4Eey4y+qB23/ahC9Mi/bJqivWgUHeLPjfLMqXcNVrFSbOB33+7N/fsWAWLJmHuFHaNwP1DqPLH9nY501qoMvY='; var decrypted = privatekey.decrypt(encrypted1, 'utf8'); console.log('使用正確的加密串解密decrypted: ', decrypted); try{ var encrypted2 ='c7kE4Eey4y+qB23/ahC9Mi/bJqivWgUHeLPjfLMqXcNVrFSbOB33+7N/fsWAWLJmHuFHaNwP1DqPLH9nY501qoMvY='; var decrypted = privatekey.decrypt(encrypted2, 'utf8'); }catch(e){ onerror(e); }finally{ onfinally(); } } })
6.私鑰文件如何放置到全局變量中,閉包寫的,有改進意見可提出,歡迎吐槽,當然也可以放到redis或者memcache中
RSAkey.js
var fs= require('fs'); var path = require('path'); module.exports = (function(){ var private = '';//在函數內聲明一個變量,作用域是函數內 return function(){ //返回的一個function能訪問到_value,所以_value並不是global級別的變量,但是可以通過這個接口訪問到 if(private=='') { var paths = path.resolve(__dirname,'../rsa_private.key'); fs.readFile(paths, 'utf-8', function (err, data) { private = data; if(private.length!=0){ console.log("success read RSA file"); } return private; }); }else{ return private; } }; })();//一個立即執行的匿名函數
初始化的時候引入
var RSAkey = require('./util/RSAkey');
var key = RSAkey();
調用時候引入
var key = RSAkey();