首頁  >  文章  >  web前端  >  使用node應用程式中timing-attack存在哪些安全漏洞

使用node應用程式中timing-attack存在哪些安全漏洞

亚连
亚连原創
2018-06-02 17:09:581733瀏覽

這篇文章給大家通過原理的原因分析了node應用的timing-attack安全漏洞問題,有興趣的朋友閱讀參考下。

前言

假如你在專案中遇過 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 &#39;cryptiles&#39;;

......
return cryptiles.fixedTimeCimparison(passwordFromDb, passwordReceived);

上面是我整理給大家的,希望今後會對大家有幫助。

相關文章:

NodeJS父進程與子進程資源共享原則與實作方法

vue中實作圖片與檔案上傳的範例程式碼

vue axios 表單提交上傳圖片的實例

#

以上是使用node應用程式中timing-attack存在哪些安全漏洞的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn