基于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 相关文章推荐
jQuery表单获取和失去焦点输入框提示效果的实例代码
Aug 01 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
Oct 29 Javascript
文本框只能选择数据到文本框禁止手动输入
Nov 22 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
Jul 20 Javascript
如何使用bootstrap框架 bootstrap入门必看!
Apr 13 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
Apr 24 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
Node.js使用Koa搭建 基础项目
Jan 08 Javascript
JavaScript中严格判断NaN的方法
Feb 16 Javascript
JS使用正则表达式提交页面验证的代码
Oct 16 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
Mar 25 Javascript
react实现复选框全选和反选组件效果
Aug 25 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
安装APACHE
2007/01/15 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
jQuery 使用个人心得
2009/02/26 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
javascript截取字符串小结
2015/04/28 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
解析vue中的$mount
2017/12/21 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
django批量导入xml数据
2016/10/16 Python
python如何重载模块实例解析
2018/01/25 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
学Python 3的理由和必要性
2019/11/19 Python
Python笔记之工厂模式
2019/11/20 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
python如何爬取网页中的文字
2020/07/28 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
法雷奥SQA(electric)面试问题
2016/01/23 面试题
恶搞卫生巾广告词
2014/03/18 职场文书
党员干部公开承诺书
2014/03/26 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android