浅析node应用的timing-attack安全漏洞


Posted in Javascript onFebruary 28, 2018

前言

假如你在项目中遇到过 eslint 报错 Potential timing attack ,不可忽视!这是一个涉及到安全的问题:时序攻击。
eslint 报错原因

首先eslint引入了一个叫做eslint-plugin-security的插件,这个插件有助于识别出潜在的安全问题,但同时也会产生误报的问题,附上插件 源码地址。

var keywords = '((' + [
  'password',
  'secret',
  'api',
  'apiKey',
  'token',
  'auth',
  'pass',
  'hash'
 ].join(')|(') + '))';

 var re = new RegExp('^' + keywords + '$', 'im');

 function containsKeyword (node) {
  if (node.type === 'Identifier') {
   if (re.test(node.name)) return true;
  }
  return
 }
 if (node.test.operator === '==' || node.test.operator === '===' || node.test.operator === '!=' || node.test.operator === '!==') {
  // 在这里 console 出错误
 }

首先这个插件会判断本次的运算符是否为 ==、===、!=、!==其中一种,其次检查标识符(字段名)是否包含特殊字符串password、secret、api、apiKey、token、auth、pass、hash,如果同时满足二者情况,eslint 就会编译报错 Potential timing attack。

攻击定义

timing attack:时序攻击,属于侧信道攻击 / 旁路攻击,侧信道攻击指的是利用信道外的信息,比如加解密的数据、数据比较时间、密文传输的流量和途径进行攻击的方式,相当于是“旁敲侧击”。

攻击点

首先讲讲js比较两个字符串大小的原理:

  • 判断字符串长度是否为0,如果为0,就可以直接比较出结果;反之,进入到第二步。
  • 字符串是由一个个字符组成,通过每个字符的charCode进行比较。
  • 在第二步中,只要出现一个字符不同,就 return false,剩余的字符不再做比较。

单个字符的比较是很快的,攻击者可以细化测量时间精度到微秒,通过响应时间的差异推算出是从哪一个字符开始不用的,这样一次次实验或者用 Python 写个脚本去跑,就可以试出正确的密码,密码破解的难度也降低了不少。

容易受攻击的写法

if (user.password === password) {
  return { state: true }; // 登录成功
 }

防御措施

每次不同的输入会造成处理时间的不同。为了防止它,我们需要使字符串比较花费相同的时间量,无论输入的密码是什么。
不容易受攻击的写法

系统中每一个密码的长度是固定的,每次比较密码是否相同时,使用正确密码的长度作为比较次数,使用异或比较每一个字符的 Unicode 编码是否相等,并且把每一次的比较结果存放到一个数组中,最后再判断数组的每一个元素是否为0(为 0 表示两个字符相同)。

// psdReceived 为用户输入密码;
 // psdDb 为系统中存储的正确用户密码
 const correctUser = (psdDb, psdReceived) => {
  const state = [];
  for (let i = 0; i < psdDb.length; ++i) {
   if (!psdReceived[i]) {
    state.push(false);
   } else {
    state.push(psdReceived.charCodeAt(i) ^ psdDb.charCodeAt(i));
   }
  }
  return state.length !== 0 && state.every(item => !item);
 }

三方包推荐

也可以使用 cryptiles 这个 npm 模块来解决这个问题

import cryptiles from 'cryptiles';

......
return cryptiles.fixedTimeCimparison(passwordFromDb, passwordReceived);
Javascript 相关文章推荐
基于jQuery试卷自动排版系统
Jul 18 Javascript
使用ExtJS技术实现的拖动树结点
Aug 05 Javascript
DOM_window对象属性之--clipboardData对象操作代码
Feb 03 Javascript
JavaScript设计模式之代理模式介绍
Dec 28 Javascript
TypeScript具有的几个不同特质
Apr 07 Javascript
Node.js静态文件服务器改进版
Jan 10 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
Nov 29 Javascript
基于vue实现swipe分页组件实例
May 25 Javascript
动态统计当前输入内容的字节、字符数的实例详解
Oct 27 Javascript
解决layui checkbox 提交多个值的问题
Sep 02 Javascript
vue修改Element的el-table样式的4种方法
Sep 17 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 Vue.js
vue组件传递对象中实现单向绑定的示例
Feb 28 #Javascript
在Vue组件中使用 TypeScript的方法
Feb 28 #Javascript
React组件中的this的具体使用
Feb 28 #Javascript
浅谈Vue网络请求之interceptors实际应用
Feb 28 #Javascript
Node.js中DNS模块学习总结
Feb 28 #Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 #Javascript
如何在vue中使用ts的示例代码
Feb 28 #Javascript
You might like
2.PHP入门
2006/10/09 PHP
无限级别菜单的实现
2006/10/09 PHP
菜鸟学PHP之Smarty入门
2007/01/04 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
原生JS进行前后端同构
2018/04/22 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
python中urllib模块用法实例详解
2014/11/19 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
10个Python小技巧你值得拥有
2018/09/29 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
python3中数组逆序输出方法
2020/12/01 Python
使用HTML5 Canvas API控制字体的显示与渲染的方法
2016/03/24 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
理工大学毕业生自荐信
2013/11/01 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
医院营销工作计划
2015/01/16 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
CSS浮动引起的高度塌陷问题
2022/08/05 HTML / CSS