浅析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学习3:操作元素属性和特性
Feb 07 Javascript
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
浅谈javascript中的闭包
May 13 Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 Javascript
JavaScript仿微博发布信息案例
Nov 16 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 Javascript
jQuery实现拖动效果的实例代码
Jun 25 jQuery
彻底理解js面向对象之继承
Feb 04 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
layui实现文件或图片上传记录
Aug 28 Javascript
angular4自定义表单控件[(ngModel)]的实现
Nov 23 Javascript
详解vue 组件的实现原理
Nov 12 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
php之字符串变相相减的代码
2007/03/19 PHP
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
javascript常用方法总结
2015/05/14 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
vue-infinite-loading2.0 中文文档详解
2018/04/08 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
npm的lock机制解析
2019/06/20 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
Python的历史与优缺点整理
2020/05/26 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
三个Unix的命令面试题
2015/04/12 面试题
男生贾里读书笔记
2015/06/30 职场文书
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python