浅析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 相关文章推荐
XMLHTTPRequest的属性和方法简介
Nov 23 Javascript
基于jquery的横向滚动条(滑动条)
Feb 24 Javascript
原生js实现日期联动
Jan 12 Javascript
AngularJS实现表单手动验证和表单自动验证
Dec 09 Javascript
AngularJS动态加载模块和依赖的方法分析
Nov 08 Javascript
Bootstrap表格制作代码
Mar 17 Javascript
深入理解ES6的迭代器与生成器
Aug 19 Javascript
深入探讨JavaScript的最基本部分之执行上下文
Feb 12 Javascript
VSCode使用之Vue工程配置eslint
Apr 30 Javascript
如何使用JavaScript实现栈与队列
Jun 24 Javascript
Vue微信公众号网页分享的示例代码
May 28 Javascript
基于VUE实现判断设备是PC还是移动端
Jul 03 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中数组合并的两种方法及区别介绍
2012/09/14 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
electron中使用bootstrap的示例代码
2018/11/06 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python3 模块、包调用&amp;路径详解
2017/10/25 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python调用摄像头拍摄数据集
2019/06/01 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
python之array赋值技巧分享
2019/11/28 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
校园摄影活动策划方案
2014/02/05 职场文书
医院工作检讨书范文
2014/02/10 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
搭建Yolov5服务器
2022/04/30 Servers