nodejs RSA 與 jsencrypt實現前端加密後端解密功能

最近幾天在給本身作的app添加一個加密解密功能,看了一些文章,最終決定使用RSA算法來作。仍是在一些問題上困擾了幾天,終於搞來搞去仍是搞出來了。javascript

1、模塊選用

node-rsa模塊:後端用的nodejs(express)框架,由於crypto模塊須要利用OpenSSL庫來實現它的加密技術,我選擇了 node-rsa模塊;html

jsencrypt模塊:前端天然是用jsencrypt模塊,這個也能夠用script引入html使用,由於我是用webpack寫的,因此直接在文件中引入jsencrypt模塊;前端

2、先後端代碼實現

後端代碼:

const   express = require('express'); 
const   app = express(); 
const 	NodeRSA = require('node-rsa'); 
const 	newkey = new NodeRSA({b: 1024});  
	  	newkey.setOptions({encryptionScheme: 'pkcs1'});	//由於jsencrypt自身使用的是pkcs1加密方案,只有從後臺改咯
let   	public_key = newkey.exportKey('pkcs8-public'),//公鑰,
	  	private_key = newkey.exportKey('pkcs8-private'); //私鑰
   	  	console.log({a:public_key,b:private_key})
let   	pubkey = new NodeRSA(public_key),
	  	prikey = new NodeRSA(private_key);
	  	pubkey.setOptions({encryptionScheme: 'pkcs1'});//由於jsencrypt自身使用的是pkcs1加密方案,只有從後臺改咯
	  	prikey.setOptions({encryptionScheme: 'pkcs1'});//由於jsencrypt自身使用的是pkcs1加密方案,只有從後臺改咯
// 	   	加密 	&&	  解密方法 
//		let encrypted = pubkey.encrypt(yourstring,'base64'); 
//		var decrypted = prikey.decrypt(encrypted, 'utf8'); 
let   	body_parse =  function(req){
	  	return JSON.parse(Object.keys(req.body)[0]+req.body[Object.keys(req.body)[0]])
}
let   	decrypted = function(req,eve,_attr){
	 	 var _user = body_parse(req)[_attr],//_attr是傳輸回來的對象中裝有密文的屬性
			str = Buffer.from(_user, 'base64').toString().replace(/%$#%/g,"+");//轉回符號'+'
	 	 var 	data = JSON.parse(prikey.decrypt(str, 'utf8')); //後端解密
	  	if(eve){
		 	eve(data);
	  	}
}

前端代碼:

const JSEncrypt = require("jsencrypt"); // 引入模塊
const obj = {username:"sweetheart",password:"mylove"};
const jencrypt = new JSEncrypt.JSEncrypt(); // 實例化加密對象
localStorage.setItem("crosspu",data['crosspu']);
jencrypt.setPublicKey(localStorage.getItem("crosspu"));	
var encryptoPasswd = jencrypt.encrypt(JSON.stringify(obj)) // 加密明文
//由於base64傳輸到後臺的時候"+"號被會轉爲空格,故而須要先替換,後臺解析的時候轉回來
var rr ={imfor:btoa(encryptoPasswd).replace(/\+/g,"%$#%")}

3、重要部分

在一些地方仍是走了寫彎路;java

一、key.setOptions({encryptionScheme: 'pkcs1'});(key是new NodeRSA()的值);node

二、密文先轉爲base64傳輸的時候先把"+"轉爲一個不常見的字符串,到後端取用的時候轉回;webpack

上述僅記錄主要的部分,最近還在寫本身的app,全面的測試只有放到後面了web