前端防暴力破解的一個設計
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
- 使用者無需輸入驗證碼
- 前端延時極小(對人來說)
- 對暴力破解影響極大
- 只需新增部分程式碼, 無需更改現有的程式碼
- 條件可控, 隨機數的範圍完全由後端決定
歡迎關注我的部落格公眾號