欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年02月28日 14:05:03   投稿:laozhang  
本篇文章給大家通過原理的原因分析了node應用的timing-attack安全漏洞問題,有興趣的朋友閱讀參考下。

前言

假如你在項目中遇到過 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 出錯誤
 }

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

攻擊定義

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

攻擊點

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

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

單個字符的比較是很快的,攻擊者可以細化測量時間精度到微秒,通過響應時間的差異推算出是從哪一個字符開始不用的,這樣一次次實驗或者用 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);

相關(guān)文章

  • 深入理解Node.js的HTTP模塊

    深入理解Node.js的HTTP模塊

    最近在工作中接觸到了Node.js標準庫提供了http模塊,所以這篇文章想總結(jié)下Node.js的HTTP模塊,方便大家和自己以后使用的時候參考借鑒。有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 詳解node HTTP請求客戶端 - Request

    詳解node HTTP請求客戶端 - Request

    Request是一個Node.jsNPM模塊,它是一個HTTP客戶端,使用簡單功能確十分強大
    2017-05-05
  • 前端常見面試題之a(chǎn)sync/await和promise的區(qū)別

    前端常見面試題之a(chǎn)sync/await和promise的區(qū)別

    async/await是異步代碼的新方式,以前的方法有回調(diào)函數(shù)和Promise,下面這篇文章主要給大家介紹了關(guān)于前端常見面試題之a(chǎn)sync/await和promise區(qū)別的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • 全面解析Node.js 8 重要功能和修復

    全面解析Node.js 8 重要功能和修復

    5月30日12點,Node.js 8正式發(fā)布了,這個版本具有一系列新功能和性能改進,并且這些功能和改進將獲得長期支持(LTS)。下面就來介紹Node.js 8版本中最重要的功能和修復
    2017-06-06
  • Node.js 中exports 和 module.exports 的區(qū)別

    Node.js 中exports 和 module.exports 的區(qū)別

    這篇文章主要介紹了Node.js 中exports 和 module.exports 的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • node.js項目如何創(chuàng)建websocket模塊

    node.js項目如何創(chuàng)建websocket模塊

    這篇文章主要介紹了node.js項目如何創(chuàng)建websocket模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Node.js在child_process域和錯誤冒泡及捕獲實踐

    Node.js在child_process域和錯誤冒泡及捕獲實踐

    這篇文章主要為大家介紹了Node.js在child_process域和錯誤冒泡及捕獲實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Node.js創(chuàng)建HTTP文件服務器的使用示例

    Node.js創(chuàng)建HTTP文件服務器的使用示例

    我們的目的比較簡單,使用Node.js創(chuàng)建一個HTTP協(xié)議的文件服務器,你可以使用瀏覽器或其它下載工具到文件服務器上下載文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Node.js如何實現(xiàn)注冊郵箱激活功能 (常見)

    Node.js如何實現(xiàn)注冊郵箱激活功能 (常見)

    今天了解了node如何實現(xiàn)郵箱激活功能,這個功能非常常見,當我們注冊一個賬號時,肯定會有這步,下面看下如何實現(xiàn)這個功能
    2017-07-07
  • 安裝 node-Sass 報錯的解決記錄(三步解決法)

    安裝 node-Sass 報錯的解決記錄(三步解決法)

    本文主要介紹了安裝 node-Sass 報錯的解決記錄(三步解決法),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05

最新評論