前言
假如你在項目中遇到過 eslint 報錯 Potential timing attack ,不可忽視!這是一個涉及到安全的問題:時序攻擊。
eslint 報錯原因
首先eslint引入了一個叫做eslint-plugin-security的插件,這個插件有助于識別出潛在的安全問題,但同時也會產生誤報的問題,附上插件 源碼地址。
首先這個插件會判斷本次的運算符是否為 ==、===、!=、!==其中一種,其次檢查標識符(字段名)是否包含特殊字符串password、secret、api、apiKey、token、auth、pass、hash,如果同時滿足二者情況,eslint 就會編譯報錯 Potential timing attack。
攻擊定義
timing attack:時序攻擊,屬于側信道攻擊 / 旁路攻擊,側信道攻擊指的是利用信道外的信息,比如加解密的數據、數據比較時間、密文傳輸的流量和途徑進行攻擊的方式,相當于是“旁敲側擊”。
攻擊點
首先講講js比較兩個字符串大小的原理:
判斷字符串長度是否為0,如果為0,就可以直接比較出結果;反之,進入到第二步。
字符串是由一個個字符組成,通過每個字符的charCode進行比較。
在第二步中,只要出現一個字符不同,就 return false,剩余的字符不再做比較。
單個字符的比較是很快的,攻擊者可以細化測量時間精度到微秒,通過響應時間的差異推算出是從哪一個字符開始不用的,這樣一次次實驗或者用 Python 寫個腳本去跑,就可以試出正確的密碼,密碼破解的難度也降低了不少。
容易受攻擊的寫法
防御措施
每次不同的輸入會造成處理時間的不同。為了防止它,我們需要使字符串比較花費相同的時間量,無論輸入的密碼是什么。
不容易受攻擊的寫法
系統中每一個密碼的長度是固定的,每次比較密碼是否相同時,使用正確密碼的長度作為比較次數,使用異或比較每一個字符的 Unicode 編碼是否相等,并且把每一次的比較結果存放到一個數組中,最后再判斷數組的每一個元素是否為0(為 0 表示兩個字符相同)。
三方包推薦
也可以使用 cryptiles 這個 npm 模塊來解決這個問題
上面是我整理給大家的,希望今后會對大家有幫助。
相關文章:
NodeJS父進程與子進程資源共享原理與實現方法
vue中實現圖片和文件上傳的示例代碼
vue axios 表單提交上傳圖片的實例
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com