基于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和Jquery获取和修改label的值的示例代码
Jan 15 Javascript
Jquery uploadify上传插件使用详解
Jan 13 Javascript
JavaScript操作 url 中 search 部分方法函数
Jun 15 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
Oct 14 Javascript
bootstrap table实例详解
Jan 06 Javascript
inner join 内联与left join 左联的实例代码
Sep 18 Javascript
一个有意思的鼠标点击文字特效jquery代码
Sep 23 jQuery
解决vue中修改export default中脚本报一大堆错的问题
Aug 27 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
layer 刷新某个页面的实现方法
Sep 05 Javascript
JS实现拼图游戏
Jan 29 Javascript
element 动态合并表格的步骤
Dec 31 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
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
domReady的实现案例
2016/11/23 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
浅谈Python浅拷贝、深拷贝及引用机制
2016/12/15 Python
python动态视频下载器的实现方法
2019/09/16 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
python实现网页录音效果
2020/10/26 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
商务主管岗位职责
2013/12/08 职场文书
三个儿子教学反思
2014/02/03 职场文书
客服部班长工作责任制
2014/02/25 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
爱的教育读书笔记
2015/06/26 职场文书
Ruby处理YAML和json数据
2022/04/18 Ruby
JS高级程序设计之class继承重点详解
2022/07/07 Javascript
Redis Lua脚本实现ip限流示例
2022/07/15 Redis
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers