浅析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 相关文章推荐
9个javascript语法高亮插件 推荐
Jul 18 Javascript
jQuery插件的写法分享
Jun 12 Javascript
仿谷歌主页js动画效果实现代码
Jul 14 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
Nov 22 Javascript
JQuery 在线引用及测试引用是否成功
Jun 24 Javascript
javascript性能优化之DOM交互操作实例分析
Dec 12 Javascript
浅谈Javascript事件对象
Feb 05 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
Mar 04 Javascript
Vue2递归组件实现树形菜单
Apr 10 Javascript
200行代码实现blockchain 区块链实例详解
Mar 14 Javascript
简单的React SSR服务器渲染实现
Dec 11 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 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
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
PHP中的加密功能
2006/10/09 PHP
一段php加密解密的代码
2006/10/09 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
arguments对象
2006/11/20 Javascript
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
浅谈Node Inspector 代理实现
2017/10/19 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
python判断windows隐藏文件的方法
2014/03/21 Python
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
Python的pygame安装教程详解
2020/02/10 Python
Python处理PDF与CDF实例
2020/02/26 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
python开发前景如何
2020/06/11 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
护士的岗位职责
2013/12/04 职场文书
学前教育毕业生自荐信范文
2013/12/24 职场文书
倡议书格式范文
2014/04/14 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
保护环境倡议书300字
2014/05/19 职场文书
食品安全承诺书
2014/05/22 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
委托证明书
2014/09/17 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang