摘要:前端防暴力破解的一個(gè)設(shè)計(jì)地址描述傳統(tǒng)的防范暴力破解的方法是在前端登錄頁面增加驗(yàn)證碼雖然能有一定程度效果但是用戶也跟著遭罪驗(yàn)證碼越復(fù)雜用戶登錄的失敗率越高于是最近我想了一個(gè)新的設(shè)計(jì)前端在登錄時(shí)采用解密的方式獲取密鑰把密鑰與表單以前發(fā)往后端用
前端防暴力破解的一個(gè)設(shè)計(jì) Demo 地址
https://github.com/GitHub-Laz...
描述傳統(tǒng)的防范暴力破解的方法是在前端登錄頁面增加驗(yàn)證碼, 雖然能有一定程度效果, 但是用戶也跟著遭罪, 驗(yàn)證碼越復(fù)雜, 用戶登錄的失敗率越高
于是最近我想了一個(gè)新的設(shè)計(jì), 前端在登錄時(shí)采用解密的方式獲取密鑰, 把密鑰與表單以前發(fā)往后端, 用密鑰來代替驗(yàn)證碼
具體細(xì)節(jié)如下
設(shè)計(jì)用戶在登錄頁面輸完用戶名密碼, 點(diǎn)擊登錄
js 向后端請(qǐng)求密文
后端生成一個(gè)隨機(jī)字符串和一個(gè)指定范圍內(nèi)的隨機(jī)數(shù)
正向拼接 隨機(jī)字符串 和 隨機(jī)字符串隨機(jī)數(shù)的加密 得到密文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);
將密文傳給前端
前端通過循環(huán)破解隨機(jī)數(shù)
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 } }
把得到的密鑰和表單一起傳個(gè)后端
后端驗(yàn)證密鑰的真假
測(cè)試經(jīng)過測(cè)試10000次內(nèi)md5加密前端用時(shí)不超過300ms, 用戶察覺不到, 但是暴力破解的難道確增加了幾千倍, 這意味這本來一個(gè)小時(shí)能破解的網(wǎng)站, 現(xiàn)在可能要一年才能破解
優(yōu)勢(shì)整個(gè)流程對(duì)后端帶來的壓力幾乎為0
用戶無需輸入驗(yàn)證碼
前端延時(shí)極小(對(duì)人來說)
對(duì)暴力破解影響極大
只需添加部分代碼, 無需更改現(xiàn)有的代碼
條件可控, 隨機(jī)數(shù)的范圍完全由后端決定
歡迎關(guān)注我的博客公眾號(hào)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71622.html