基于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 数组排序函数
Aug 20 Javascript
JavaScript OOP类与继承
Nov 15 Javascript
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
在jQuery ajax中按钮button和submit的区别分析
Oct 07 Javascript
JQuery对表单元素的基本操作使用总结
Jul 18 Javascript
IScroll5 中文API参数说明和调用方法
May 21 Javascript
JS动态给对象添加事件的简单方法
Jul 19 Javascript
JS常用函数和常用技巧小结
Oct 15 Javascript
80%应聘者都不及格的JS面试题
Mar 21 Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
vue同步父子组件和异步父子组件的生命周期顺序问题
Oct 07 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
May 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 流程控制switch的简单实例
2016/06/07 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
将Sublime Text 3 添加到右键中的简单方法
2017/12/12 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python中for循环详解
2014/01/17 Python
Python中运行并行任务技巧
2015/02/26 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
C#怎么让一个窗口居中显示?
2015/10/20 面试题
解释下面关于J2EE的名词
2013/11/15 面试题
单位门卫岗位职责
2013/12/20 职场文书
污水厂厂长岗位职责
2014/01/04 职场文书
保研推荐信格式
2015/03/25 职场文书
面试通知短信
2015/04/20 职场文书
鸡毛信观后感
2015/06/11 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
python自动计算图像数据集的RGB均值
2021/06/18 Python