淺析node應(yīng)用的timing-attack安全漏洞

前言

創(chuàng)新互聯(lián)公司是一家專業(yè)提供香洲企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站設(shè)計、HTML5、小程序制作等業(yè)務(wù)。10年已為香洲眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

假如你在項目中遇到過 eslint 報錯 Potential timing attack ,不可忽視!這是一個涉及到安全的問題:時序攻擊。
eslint 報錯原因

首先eslint引入了一個叫做eslint-plugin-security的插件,這個插件有助于識別出潛在的安全問題,但同時也會產(chǎn)生誤報的問題,附上插件 源碼地址。

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 出錯誤
 }

首先這個插件會判斷本次的運算符是否為 ==、===、!=、!==其中一種,其次檢查標(biāo)識符(字段名)是否包含特殊字符串password、secret、api、apiKey、token、auth、pass、hash,如果同時滿足二者情況,eslint 就會編譯報錯 Potential timing attack。

攻擊定義

timing attack:時序攻擊,屬于側(cè)信道攻擊 / 旁路攻擊,側(cè)信道攻擊指的是利用信道外的信息,比如加解密的數(shù)據(jù)、數(shù)據(jù)比較時間、密文傳輸?shù)牧髁亢屯緩竭M(jìn)行攻擊的方式,相當(dāng)于是“旁敲側(cè)擊”。

攻擊點

首先講講js比較兩個字符串大小的原理:

  • 判斷字符串長度是否為0,如果為0,就可以直接比較出結(jié)果;反之,進(jìn)入到第二步。
  • 字符串是由一個個字符組成,通過每個字符的charCode進(jìn)行比較。
  • 在第二步中,只要出現(xiàn)一個字符不同,就 return false,剩余的字符不再做比較。

單個字符的比較是很快的,攻擊者可以細(xì)化測量時間精度到微秒,通過響應(yīng)時間的差異推算出是從哪一個字符開始不用的,這樣一次次實驗或者用 Python 寫個腳本去跑,就可以試出正確的密碼,密碼破解的難度也降低了不少。

容易受攻擊的寫法

if (user.password === password) {
  return { state: true }; // 登錄成功
 }

防御措施

每次不同的輸入會造成處理時間的不同。為了防止它,我們需要使字符串比較花費相同的時間量,無論輸入的密碼是什么。
不容易受攻擊的寫法

系統(tǒng)中每一個密碼的長度是固定的,每次比較密碼是否相同時,使用正確密碼的長度作為比較次數(shù),使用異或比較每一個字符的 Unicode 編碼是否相等,并且把每一次的比較結(jié)果存放到一個數(shù)組中,最后再判斷數(shù)組的每一個元素是否為0(為 0 表示兩個字符相同)。

 // psdReceived 為用戶輸入密碼;
 // psdDb 為系統(tǒng)中存儲的正確用戶密碼
 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);

新聞名稱:淺析node應(yīng)用的timing-attack安全漏洞
文章鏈接:http://bm7419.com/article18/ijpdgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站品牌網(wǎng)站建設(shè)、搜索引擎優(yōu)化、虛擬主機(jī)、標(biāo)簽優(yōu)化、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)