基于node简单实现RSA加解密的方法步骤


Posted in Javascript onMarch 21, 2019

因项目登录密码字段没有加密引起安全问题,琢磨了下如何基于RSA加密,进行前后端通信(Java项目)。空余时间,看了下在node下的实现。

一、准备

前端是利用jsencrypt.js去加密,后端利用node-rsa去生成公私钥并解密。

二、实现

我是使用koa2初始化的项目。首先,需要前端页面显示和处理加密数据,所以直接在views中新建了index.html,用html为了不在学习模板上花时间。

修改index中的路由,

router.get('/', async (ctx, next) => {
  await ctx.render('index.html');
});

在html中引入jsencrypt.js,界面内容仅为一个输入框和发送命令的按钮:

<body>
  <input type="text" id="content"/>
  <button id="start">gogogog</button>
</body>
<script src="/javascripts/jsencrypt.js"></script>
<script>
document.getElementById('start').onclick = function() {
  // 获取公钥
  fetch('/publicKey').then(function(res){
    return res.text();
  }).then(function(publicKey) {
    // 设置公钥并加密
    var encrypt = new JSEncrypt();
    encrypt.setPublicKey(publicKey);
    var encrypted = encrypt.encrypt(document.getElementById('content').value);
    // 发送私钥去解密
    fetch('/decryption', {
      method: 'POST',
      body: JSON.stringify({value:encrypted})
    }).then(function(data) {
      return data.text();
    }).then(function(value) {
      console.log(value);
    });
  });
};
</script>

点击按钮,将输入框中的值先加密,再发送给服务器解密并打印该值。

前端用到了,publicKey和decryption接口,来看下服务端的实现。

首先引入node-rsa包,并创建实例,再输出公私钥,其中,setOptions必须得加上,否者会有报错问题。

const NodeRSA = require('node-rsa');
const key = new NodeRSA({b: 1024});
// 查看 https://github.com/rzcoder/node-rsa/issues/91
key.setOptions({encryptionScheme: 'pkcs1'}); // 必须加上,加密方式问题。

publicKey(GET),用于获取公钥,只需要调用下内置的方法就行了,

router.get('/publicKey', async (ctx, next) => {
  var publicDer = key.exportKey('public');
  var privateDer = key.exportKey('private');
  console.log('公钥:', publicDer);
  console.log('私钥:', privateDer);
  ctx.body = publicDer;
});

公钥传出给前端加密用,后端使用私钥解密,

router.post('/decryption', async (ctx, next) => {
  var keyValue = JSON.parse(ctx.request.body).value;
  const decrypted = key.decrypt(keyValue, 'utf8');
  console.log('decrypted: ', decrypted);
  ctx.body = decrypted;
});

解密时调用decrypt进行解密,前端控制台就能输出对应的值了。

三、demo详细代码

说这么多,直接查看代码最直观啦,详细代码查看:demo。

npm i & npm run start

访问3000端口就可以了。

四、实际项目

在使用npm安装方式(vue或react)的项目中,可以这么使用:

npm i jsencrypt
// 实际使用
import { JSEncrypt } from 'jsencrypt';

项目地址可以查看:https://github.com/2fps/blooog。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS控件autocomplete 0.11演示及下载 1月5日已更新
Jan 09 Javascript
使用onbeforeunload属性后的副作用
Mar 08 Javascript
jQuery UI的Dialog无法提交问题的解决方法
Jan 11 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
vue组件表单数据回显验证及提交的实例代码
Aug 30 Javascript
微信小程序使用gitee进行版本管理
Sep 20 Javascript
详解node字体压缩插件font-spider的用法
Sep 28 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
Apr 16 Javascript
js实现表格单列按字母排序
Aug 12 Javascript
基于jquery实现彩色投票进度条代码解析
Aug 26 jQuery
移动端JS实现拖拽两种方法解析
Oct 12 Javascript
JS数组去重详情
Nov 07 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
Mar 21 #Javascript
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 #Javascript
详解JS取出两个数组中的不同或相同元素
Mar 20 #Javascript
详解vue中axios的使用与封装
Mar 20 #Javascript
javascript数组去重方法总结(推荐)
Mar 20 #Javascript
浅谈JavaScript面向对象--继承
Mar 20 #Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
Mar 20 #Javascript
You might like
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
两个数组去重的JS代码
2013/12/04 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
分享Python文本生成二维码实例
2016/01/06 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
windows下python安装pip方法详解
2020/02/10 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
Python xlwt模块使用代码实例
2020/06/10 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
.net软件工程师面试题
2015/03/31 面试题
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
大学生职业生涯规划书范文
2014/01/14 职场文书
工作证明英文模板
2014/10/21 职场文书
导游词之阆中古城
2019/12/23 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
MongoDB使用场景总结
2022/02/24 MongoDB
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫