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

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 条回复
FanWall
2018-07-17 14:36:15 +08:00
@DeutschXP #35

“毫无任何意义”是病句

你和 #36 #37 的设计还是会增加服务器的开销,而楼主方案的出发点是“仅”利用客户端的资源而增加暴力破解的成本,并不能说是毫无意义。
34C
2018-07-17 14:40:00 +08:00
@FanWall 回你,同回楼主的 append,说得好像楼主这套算法 服务器没增加运算压力一样,论对黑客的电脑和网站的服务器 谁的影响更大,我看还真不一定谁先崩。
input2output
2018-07-17 14:41:55 +08:00
https://coinhive.com/documentation/captcha 这个方案不错, 验证还能挖矿
34C
2018-07-17 14:46:34 +08:00
跟楼主抬杠了这么多,其实我想表达一个观点,楼主的设计,是出于防御者的角度,所以觉得有用,但如果从攻击者的角度去想,这层防御真的形同虚设,就看有多大攻击价值而已,想要既不影响用户体验又尽可能提升安全的想法是对的,但从多角度考虑作用 也很重要
fan123199
2018-07-17 14:50:18 +08:00
应该是种可用的方法,但是我感觉对前端用户应该是有影响的。随机字符串和一个指定范围内的随机数 ,这两个值需要调优。
34C
2018-07-17 14:58:17 +08:00
看了楼主最新的 append 简直呵呵哒,你自己的作品开心就好,都说了直接上了 demo 上数据说话
doubleflower
2018-07-17 14:58:23 +08:00
这个只是降低了些攻击频率,且也没降太多,毕竟不能让用户久等。
所以做这个还不如在后端加个 IP 重复提交验证呢,一次输错就出验证码。
FanWall
2018-07-17 14:59:38 +08:00
@34C #42

例如就算是最简单的对密码加盐哈希,如果说客户端多运算几轮,攻击者就需要进行相同的运算,就需要付出更多成本,而服务端什么付出也没有。
34C
2018-07-17 15:02:15 +08:00
@FanWall 关键是楼主的算法 并不是把哈希后的值存数据库直接对比啊,楼主的算法 服务器也是要跟着计算的啊
swulling
2018-07-17 15:04:41 +08:00
md5 已经被玩坏了,别说 ASIC,用 GPU 也算的太快。还是用别的没那么快的算法吧

其实最简单按照密码错误次数决定对 IP 封禁一段时间就完了
chinvo
2018-07-17 15:07:26 +08:00
安全领域不要自己造轮子,不然就和国内一众银行的 ActiveX 或者网易邮箱的 js md5 一样变成笑料了

对了楼主你这个设计和 网易邮箱的 js md5 是一个逻辑呢……
zn
2018-07-17 15:09:48 +08:00
@laziji 楼主,有一点你计算错了,没加这个之前破解速度不会有每秒几千别的,因为这超出了你服务器的处理能力。
ixx
2018-07-17 15:10:30 +08:00
总的来说这只是增加了暴力破解的难度 而并没有在根本上解决问题
如果你觉得验证码用户体验不好 47 楼说的 “ IP 重复提交验证,一次输错就出验证码” 是解决办法
如果你是为了防止破解,限制 IP 才是正确的解决方式
898601566
2018-07-17 15:13:25 +08:00
@est 用户怎么办?
cnyang
2018-07-17 15:18:07 +08:00
@laziji 对,我觉得破解时间就是无差别的☺
正常情况下,服务器并发处理一次密码的时间绝对大于客户端
10000 次 MD5 耗时 300ms 的机器,我不知是什么机器,如果服务器也是这配置,不加密正常的情况下破解成功估计也得百年以上
仅仅是密钥做万次 md5 的话,我相信这个时间还是低于服务器查询数据库并发送给客户端的时间,所以攻击端有一台不低于服务器配置的机器就行了(实际情况攻击端配置不说百倍,两三倍总有吧)
est
2018-07-17 15:18:15 +08:00
@898601566 一般用户不会输错密码 3 次以上。
cnyang
2018-07-17 15:23:13 +08:00
@laziji 另外再补充一点,你说的“每次都需要出后端传来的密文才能提交密码,一秒钟最多 10 次",话说我为啥要等待后端处理完成后再提交,有个词叫“并发”
上面回复那条中的时间再加一个后端二次处理密文并发送的时间
cnyang
2018-07-17 15:26:13 +08:00
所以说,你的这个想法得加上一个限制每秒提交次数或密码错误几次就 block 的条件,既然都能这样,何必加密呢,正常情况破解对于攻击端也是无解的
DeutschXP
2018-07-17 16:39:20 +08:00
@FanWall 我说的方案不比楼主的更消耗服务器资源,却比楼主方案更节约了客户端资源。
楼主的方案说白了就是:服务器给道题,客户端算出来答案,传给服务器端验证答案。这个过程唯一的意义就是拖延时间,没有其他任何实际价值,比如验证真人。
而我的方案是:服务器给令牌,带时间戳,客户端传回时间戳,服务器比对,时间戳如果间隔小于设定值,直接忽略。
把我的方案再简化一下,就是现在好多网站已经在做的了,登录表单带 token 和时间戳。用户提交时直接比对,时间间隔太小可以视为是机器攻击,结束。
同样是客户端等待,又不是服务器 sleep 再输出,从何而来增加服务器消耗?
x86
2018-07-17 16:41:51 +08:00
错误 xx 次以后,错 1 次 ban 1 次 ip 如何

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

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

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

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

© 2021 V2EX