基于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 相关文章推荐
用javascript连接access数据库的方法
Nov 17 Javascript
Gird组件 Part-3:范例RSSFeed Viewer
Mar 10 Javascript
javascript 简练的几个函数
Aug 29 Javascript
Jquery Ajax的Get方式时需要注意URL地方
Apr 07 Javascript
JS高级拖动技术 setCapture,releaseCapture
Jul 31 Javascript
两个listbox实现选项的添加删除和搜索
Mar 01 Javascript
浅析node.js中close事件
Nov 26 Javascript
js弹出窗口返回值的简单实例
May 28 Javascript
详解浏览器渲染页面过程
Feb 09 Javascript
js 函数式编程学习笔记
Mar 25 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
Jun 10 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
Apr 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动态生成VRML网页
2006/10/09 PHP
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
php中动态修改ini配置
2014/10/14 PHP
php输出形式实例整理
2020/05/05 PHP
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
Python多线程编程(一):threading模块综述
2015/04/05 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
Python中return self的用法详解
2018/07/27 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
使用python计算三角形的斜边例子
2020/04/15 Python
python TCP包注入方式
2020/05/05 Python
什么是python类属性
2020/06/10 Python
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
信息管理员岗位职责
2013/12/01 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
实验室的标语
2014/06/20 职场文书
爱心募捐通知范文
2015/04/27 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL