普通网站防暴力破解登录密码的新设计

2018-07-17 12:57:03 +08:00
 laziji

shield

前端防暴力破解的一个设计

Demo 地址

https://github.com/GitHub-Laziji/shield

描述

传统的防范暴力破解的方法是在前端登录页面增加验证码, 虽然能有一定程度效果, 但是用户也跟着遭罪, 验证码越复杂, 用户登录的失败率越高

于是最近我想了一个新的设计, 前端在登录时采用解密的方式获取密钥, 把密钥与表单以前发往后端, 用密钥来代替验证码

具体细节如下

设计

    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, 用户察觉不到, 但是暴力破解的难道确增加了几千倍, 这意味这本来一个小时能破解的网站, 现在可能要一年才能破解

优势

17043 次点击
所在节点    分享创造
125 条回复
gam2046
2018-07-17 16:47:19 +08:00
想法很不错呀,不知道上面的各位槽点在哪里呢?

不过我觉得错 N 次,阻止继续登陆 X 小时,就足够了。

你的方案是建立在允许无限重试的情况下,但是实际中,很少有允许无穷测试的情况存在呀。
kenorizon
2018-07-17 16:56:57 +08:00
本质上和服务器上延迟 1000ms 才响应是一样的,多线程可破,还增加了服务器的压力。
如果说这种方案在服务器的运行验证的压力非常小,那么这种方案形成的障碍对攻击者而言也一样微不足道了。
LucasLee92
2018-07-17 16:57:50 +08:00
@gam2046 想法是不错,但是现在网站密码的痛点应该是在 @suley 所提出的问题
hicdn
2018-07-17 16:58:30 +08:00
@est 会超过 3 次,长时间不登录的网站,密码要多试几次才能对上。以前用一些规则来生成密码,中间升级过算法,经常忘了网站用的哪套算法生成的密码,只好遍历了。用了密码管理工具后就没这问题了。
xmbaozi
2018-07-17 16:58:47 +08:00
虽然应用场景不多,起码是一个独特的思路。
hahastudio
2018-07-17 17:02:16 +08:00
@hicdn 这样你应该用重置密码的功能
dallaslu
2018-07-17 17:03:07 +08:00
知乎上有提问,不过回答的不多
https://www.zhihu.com/question/47373358

使用类似原理的验证服务
https://coinhive.com/documentation/captcha

相关研究
https://eprint.iacr.org/2016/145.pdf
zhangyuting
2018-07-17 17:05:07 +08:00
你的想法是合理的,我听起来像是 hashcash 的原理,你觉得呢?
suley
2018-07-17 17:41:43 +08:00
@x86 你说的就是现在通用的做法,不新鲜,ban ip, ban 账号, ban 设备指纹, ban cookie, ban mac...很多网站 /app 都有这样的规则了。
honeycomb
2018-07-17 18:03:32 +08:00
可以考虑让前端跑一个 scrypt/bcrypt/argon,而不是 md5
snw
2018-07-17 18:04:29 +08:00
首先你要考虑访客客户端性能可能多差,以及不同浏览器的执行效率。你电脑上特定跑 300ms,访客破手机上另一个浏览器可能卡死几秒甚至十几秒。
其次 md5 高速运算很容易,攻击者有心的话不一定用浏览器去跑,而是用高效语言重写一下,参数扔进去借助 GPU 去算,算完后回传浏览器,可能平均只需几毫秒。这也就意味着攻击者可以模仿上千个正常访客。

顺便吐槽下工商企业信息公示系统用的宇创防护,好像也用了些奇技淫巧,经常导致浏览器卡死。
imn1
2018-07-17 18:44:49 +08:00
只看到「前端」两个字,就看完了
lain0
2018-07-17 18:49:29 +08:00
防暴破的 hash 算法 scrypt/bcrypt 的基本思路也是如此,樓主這個把工作量證明的計算放到前端的想法很聰明。樓主是否學過加密學的課程?

不過驗證碼的作用除了防止暴力破解之外還可以防止機器人登入。
Mohanson
2018-07-17 19:03:53 +08:00
楼上有个兄台说的好, 为什么不直接服务器延迟响应 300 ms.
laziji
2018-07-17 19:25:33 +08:00
@zhangyuting 这个设计只是偶然的突发奇想 , 觉得这个可行 . 你说的 hashcash 我刚刚去查了一下资料 异曲同工啊 , 在邮件过滤方面有应用, 不错啊 有机会可以探讨一下
wobushizhangsan
2018-07-17 19:28:23 +08:00
把随机数范围也从后端返回,错的越多返回随机数越大。不过仅有前端也不行,后端还得要 ip 拉黑,用户名拉黑功能。
zzNucker
2018-07-17 19:29:12 +08:00
这想法就是个 POW 啊,又不新鲜。。。。。 楼上还这么多人抨击 。。。
laziji
2018-07-17 19:31:54 +08:00
@lain0 有粗略了解过加密学 , 你说的验证码防机器人我也非常赞同 , 不过现在好多网站的验证码通过图像识别很好识别出来, 所以尝试从其他方向解决这个问题 就想到了这个设计 , 还要很多不足的地方 待改进.
wobushizhangsan
2018-07-17 19:32:31 +08:00
把随机数范围也从后端返回,错的越多返回随机数越大。不过仅有前端挖矿也不行,后端还得有 ip 拉黑,用户名拉黑功能。
laziji
2018-07-17 19:40:34 +08:00
@wobushizhangsan 谢谢你的建议 , 其实随机数范围可返回也可以不返回 因为前端从 0 开始遍历 总会找到那个答案 , 不过这个对全心就是想破解你这个网站的攻击者来说 确实不够安全 , IP , 用户名 加上其他的机制也是必须的 , 这个设计最大的意义是把大部分攻击者拦在第一道门前, 减少服务器压力

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/471580

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX