基于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+css 网页每次加载不同样式的实现方法
Dec 27 Javascript
JavaScript prototype对象的属性说明
Mar 13 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
Oct 23 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
首页图片漂浮效果示例代码
Jun 05 Javascript
jquery中取消和绑定hover事件的实现代码
Jun 02 Javascript
js实现加载更多功能实例
Oct 27 Javascript
微信小程序 scroll-view组件实现列表页实例代码
Dec 14 Javascript
微信小程序实现刷脸登录
May 25 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
解决layui富文本编辑器图片上传无法回显的问题
Sep 18 Javascript
JavaScript 如何在浏览器中使用摄像头
Dec 02 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
koa源码中promise的解读
2018/11/13 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
Python3生成手写体数字方法
2018/01/30 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
Python列表list操作相关知识小结
2020/01/29 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
J2EE模式面试题
2016/10/11 面试题
活动志愿者自荐信
2014/01/27 职场文书
护士在校生自荐信
2014/02/01 职场文书
文明班级建设方案
2014/05/15 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
成绩报告单家长评语
2014/12/30 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
使用python绘制分组对比柱状图
2022/04/21 Python