zoukankan      html  css  js  c++  java
  • node.js下使用RSA加密事例(windows)

    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(); 
  • 相关阅读:
    自定义类似MessageBox小窗体操作
    WinForm 遍历用户控件里CheckBox
    WinForm BaseClass类常用通用方法
    分页的几种写法
    克服粗心毛病的伪代码
    C++queue的使用
    Unix网络编程学习 < 一 >
    使用log4cxx
    memset函数
    libcurl在windows下的使用
  • 原文地址:https://www.cnblogs.com/xiashan17/p/5909255.html
Copyright © 2011-2022 走看看