国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

淺析node應用的timing-attack安全漏洞

2019-11-19 14:16:30
字體:
來源:轉載
供稿:網友

前言

假如你在項目中遇到過 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);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁津县| 潮州市| 保靖县| 长兴县| 宜章县| 梨树县| 五原县| 合川市| 将乐县| 扎兰屯市| 青神县| 来宾市| 芜湖市| 南郑县| 寻乌县| 嘉义市| 桓台县| 桦川县| 乐山市| 碌曲县| 平山县| 瓦房店市| 那坡县| 高青县| 山阳县| 清新县| 德化县| 灵宝市| 探索| 永寿县| 通海县| 明星| 赫章县| 涞水县| 邵东县| 临高县| 新巴尔虎右旗| 越西县| 石景山区| 石台县| 长治县|