最近幾天在給本身作的app添加一個加密解密功能,看了一些文章,最終決定使用RSA算法來作。仍是在一些問題上困擾了幾天,終於搞來搞去仍是搞出來了。javascript
node-rsa模塊:後端用的nodejs(express)框架,由於crypto模塊須要利用OpenSSL庫來實現它的加密技術,我選擇了 node-rsa模塊;html
jsencrypt模塊:前端天然是用jsencrypt模塊,這個也能夠用script引入html使用,由於我是用webpack寫的,因此直接在文件中引入jsencrypt模塊;前端
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,"%$#%")}
在一些地方仍是走了寫彎路;java
一、key.setOptions({encryptionScheme: 'pkcs1'});(key是new NodeRSA()的值);node
二、密文先轉爲base64傳輸的時候先把"+"轉爲一個不常見的字符串,到後端取用的時候轉回;webpack
上述僅記錄主要的部分,最近還在寫本身的app,全面的測試只有放到後面了web