浅析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 相关文章推荐
另类调用flash无须激活的方法
Dec 27 Javascript
js两行代码按指定格式输出日期时间
Oct 21 Javascript
jQuery自定义动画函数实例详解(附demo源码)
Dec 10 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
Jan 08 Javascript
javascript自定义滚动条实现代码
Apr 20 Javascript
原生js编写autoComplete插件
Apr 13 Javascript
ES6正则表达式的一些新功能总结
May 09 Javascript
详解jquery插件jquery.viewport.js学习使用方法
Sep 08 jQuery
详解React开发必不可少的eslint配置
Feb 05 Javascript
vue中设置、获取、删除cookie的方法
Sep 21 Javascript
基于jquery ajax的多文件上传进度条过程解析
Sep 11 jQuery
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 Javascript
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
收集的PHP中与数组相关的函数
2007/03/22 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
angularjs下拉框空白的解决办法
2017/06/20 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
[57:59]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第一场 11.05
2020/11/05 DOTA
Python去除字符串两端空格的方法
2015/05/21 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
python 字段拆分详解
2019/12/17 Python
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
公司董事长职责
2013/12/12 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
小组口号霸气押韵
2015/12/24 职场文书