基于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代码
Nov 20 Javascript
javascript使用activex控件的代码
Jan 27 Javascript
原生js做的手风琴效果的导航菜单
Nov 08 Javascript
图片上传插件jquery.uploadify详解
Nov 15 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
May 04 Javascript
CSS javascript 结合实现悬浮固定菜单效果
Aug 23 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
Aug 31 Javascript
javascript实现二级级联菜单的简单制作
Nov 19 Javascript
jquery实现select选择框内容左右移动代码分享
Nov 21 Javascript
限制只能输入数字的实现代码
May 16 Javascript
vuex学习之Actions的用法详解
Aug 29 Javascript
AngularJS 事件发布机制
Aug 28 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的控制语句
2006/10/09 PHP
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
js时间日期和毫秒的相互转换
2013/02/22 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
解析Python中while true的使用
2015/10/13 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
Python unittest模块用法实例分析
2018/05/25 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
最经典的商业地产项目广告词
2014/03/13 职场文书
中国梦演讲稿3分钟
2014/08/19 职场文书
营销总监岗位职责
2014/09/16 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
我的暑假生活作文(五年级)范文
2019/08/07 职场文书
python基础之函数的定义和调用
2021/10/24 Python