浅析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 相关文章推荐
编辑浪子版表单验证类
May 12 Javascript
jQuery 版本的文本输入框检查器Input Check
Jul 09 Javascript
写出更好的JavaScript程序之undefined篇(中)
Nov 23 Javascript
JavaScript 字符串处理函数使用小结
Dec 02 Javascript
JS跨域总结
Aug 30 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
Feb 16 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
Dec 31 Javascript
Jquery异步提交表单代码分享
Mar 26 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
Oct 07 Javascript
JS实现的简单表单验证功能示例
Oct 13 Javascript
浅谈Layui的eleTree树式选择器使用方法
Sep 25 Javascript
jQuery实现点击滚动到指定元素上的方法分析
Mar 19 jQuery
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生成随机密码类分享
2014/06/25 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
yii用户注册表单验证实例
2015/12/26 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
php实现微信发红包功能
2018/07/13 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
JavaScript错误处理
2015/02/03 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
vant时间控件使用方法详解
2020/12/24 Javascript
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
python解析xml文件操作实例
2014/10/05 Python
Python实现批量下载文件
2015/05/17 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
2019年Java 最常见的 面试题
2016/10/19 面试题
数据员岗位职责
2013/11/19 职场文书
员工培训邀请函
2014/01/11 职场文书
停车位租赁协议书
2014/09/24 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
Go使用协程交替打印字符
2021/04/29 Golang
Python数据分析之pandas读取数据
2021/06/02 Python
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python