基于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的时候写的学习笔记
Dec 30 Javascript
js时间日期和毫秒的相互转换
Feb 22 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
Jul 14 Javascript
Javascript对象属性方法汇总
Nov 21 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
Nov 02 Javascript
使用window.prompt()实现弹出用户输入的对话框
Apr 13 Javascript
Bootstrap每天必学之滚动监听
Mar 16 Javascript
AngularJS  自定义指令详解及实例代码
Sep 14 Javascript
AngularJS过滤器filter用法分析
Dec 11 Javascript
简述jQuery Easyui一些用法
Aug 01 jQuery
React Native日期时间选择组件的示例代码
Apr 27 Javascript
关于layui 弹出层一闪而过就消失的解决方法
Sep 09 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
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
php 浮点数比较方法详解
2017/05/05 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
PHP 断点续传实例详解
2017/11/11 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
Python与Java间Socket通信实例代码
2017/03/06 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python cs架构实现简单文件传输
2020/03/20 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
中国高端家电购物商城:顺电
2018/03/04 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
外贸主管求职简历的自我评价
2013/10/23 职场文书
交通文明倡议书
2014/05/16 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
详解PyTorch模型保存与加载
2022/04/28 Python