普通網站防暴力破解的新設計

辣子雞發表於2019-01-19

前端防暴力破解的一個設計

Demo 地址

https://github.com/GitHub-Laz…

描述

傳統的防範暴力破解的方法是在前端登入頁面增加驗證碼, 雖然能有一定程度效果, 但是使用者也跟著遭罪, 驗證碼越複雜, 使用者登入的失敗率越高

於是最近我想了一個新的設計, 前端在登入時採用解密的方式獲取金鑰, 把金鑰與表單以前發往後端, 用金鑰來代替驗證碼

具體細節如下

設計

  • 使用者在登入頁面輸完使用者名稱密碼, 點選登入
  • js 向後端請求密文
  • 後端生成一個隨機字串和一個指定範圍內的隨機數
  • 正向拼接 隨機字串 和 隨機字串隨機數的加密 得到密文rstr+MD5(rstr+rint)
  • 反向拼接 得到 金鑰 MD5(rint+rstr)
    randomString = Utils.getUUID();
    randomNumber = Utils.randomInt(range);
    privateText =  randomString + Utils.md5(randomString+randomNumber);
    privateKey= Utils.md5(randomNumber+randomString);
  • 將密文傳給前端
  • 前端通過迴圈破解隨機數
    let randomString = result.substring(0, 32)
    let valueString = result.substring(32)
    let answerString
    for (let i = 0; i < range; i++) {
        let s = crypto.createHash("md5").update(randomString + i).digest(`hex`)
        if (s == valueString) {
            answerString = crypto.createHash("md5").update(i + randomString).digest(`hex`)
            break
        }
    }
  • 把得到的金鑰和表單一起傳個後端
  • 後端驗證金鑰的真假

測試

經過測試10000次內md5加密前端用時不超過300ms, 使用者察覺不到, 但是暴力破解的難道確增加了幾千倍, 這意味這本來一個小時能破解的網站, 現在可能要一年才能破解

優勢

  • 整個流程對後端帶來的壓力幾乎為0
  • 使用者無需輸入驗證碼
  • 前端延時極小(對人來說)
  • 對暴力破解影響極大
  • 只需新增部分程式碼, 無需更改現有的程式碼
  • 條件可控, 隨機數的範圍完全由後端決定

歡迎關注我的部落格公眾號
圖片描述

相關文章