基于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 选项卡效果 新手代码
Jul 08 Javascript
jquery sortable的拖动方法示例详解
Jan 16 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
May 29 Javascript
使用jQuery管理选择结果
Jan 20 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
Javascript实现运算符重载详解
Apr 07 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
Jul 29 Javascript
vue实现移动端项目多行文本溢出省略
Jul 29 Javascript
JavaScript实现原型封装轮播图
Dec 27 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 include加载文件两种方式效率比较
2010/08/08 PHP
php写的AES加密解密类分享
2014/06/20 PHP
php数组使用规则分析
2015/02/27 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
浅谈用VSCode写python的正确姿势
2017/12/16 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
车间主管岗位职责
2013/11/14 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
司机岗位职责说明书
2014/07/29 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
个人整改措施书面材料
2014/10/24 职场文书
部门2015年度工作总结
2015/04/29 职场文书
奔腾年代观后感
2015/06/09 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
作文之亲情600字
2019/09/23 职场文书
MySQL GTID复制的具体使用
2022/05/20 MySQL