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

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 条回复
just1
2018-07-17 13:00:16 +08:00
模拟你这个流程不就好了
laziji
2018-07-17 13:01:22 +08:00
@just1 就是强制黑客来模拟这个流程啊
cnyang
2018-07-17 13:16:42 +08:00
同 1l 所说,加解密方法是暴露的,破解的流程只是多增加了一步而已,客户端处理性能够强大,和正常破解时间无差别
34C
2018-07-17 13:21:21 +08:00
毫无意义啊…………
lance6716
2018-07-17 13:26:53 +08:00
怕不是每次登录都要挖矿…
bk201
2018-07-17 13:27:05 +08:00
没看懂,看上去就是增加一次调用时间成本,那直接限定频率不就结束了?
suley
2018-07-17 13:28:10 +08:00
有点意思。和比特币的 POW 有点类似,都是强制客户端做一个很耗时的计算,来提高黑客攻击的成本。

不过本来现在暴力破解类型的攻击也很少了,因为稍微靠谱一点的平台都会限制密码错误的次数;

现在主要风险是用户密码泄露,黑客用自动脚本批量尝试登陆泄露的账号密码,基于安全考虑,当用户账号在陌生环境登陆的时候,要求输入验证码,只是为了做图灵测试而已。
laziji
2018-07-17 13:28:13 +08:00
@cnyang 你觉得破解时间无差别吗? 普通的电脑暴力破解开多线程 一秒钟可以尝试几千次 , 用了这个 每次都需要出后端传来的密文才能提交密码 一秒钟最多 10 次, 会没有区别吗? 而且加密方法本来就没打算隐藏啊, MD5 不可逆 知道了又如何
golmic
2018-07-17 13:30:00 +08:00
毫无意义+1
adjusted
2018-07-17 13:31:48 +08:00
有点像 coinhive 的 Proof of Work Captcha
est
2018-07-17 13:32:04 +08:00
我跟你们说个新思路:

用户输入错误 3 次密码之后,无论输入什么密码都能进入账户,不过看到的内容全 tm 是假的!

爬虫、脱裤的你们随便抓。能抓到有价值的东西算我输!
laziji
2018-07-17 13:33:05 +08:00
@bk201 限制频率 要么使用 cookie 保存 (用程序可以绕过) ,
使用 session 保存 (也可以绕过)
使用数据库限制用户名 (影响普通用户 , 而且需要多张表 , 每次需要差数据库)
使用数据库限制 IP (同上, 而且 ip 可以代理 , 并且同局域网对外是同一个 IP , 比如校园网 一个人违规 所有人都限制了)
laziji
2018-07-17 13:34:37 +08:00
@34C 为何?
VoidChen
2018-07-17 13:36:37 +08:00
@est 这让我想起了很久以前看到的“蜜罐‘啊
bk201
2018-07-17 13:39:43 +08:00
@laziji 你说的都是什么鬼,限制频率很简单,方法很多,搜下就有.你的这种做法其实并不会给暴力破解增加多少难度,因为如果用服务器跑解密比用户浏览器的 js 引擎跑解密快多了,反而你会增加页面代码复杂度以及流畅度.
qiutianaimeili
2018-07-17 13:40:52 +08:00
如果单单只是无脑的暴力破解可能比较耗时,可是你这里已经把破解的方法写在前端 js 里了,人家照着你的这个破解方法不就可以破解了吗?
bk201
2018-07-17 13:43:14 +08:00
@VoidChen 他这个并不是蜜罐啊.你给我倒是个启发,无论前端发什么过来都登录成功,但是返回的 url 确实一个假 url
est
2018-07-17 13:44:01 +08:00
@VoidChen 没错。
34C
2018-07-17 13:44:56 +08:00
@laziji

如果是防止通用型的暴力工具,那大部分的通用工具的通用性并不强,所以真的想暴力的,真没几个用通用工具的。

如果写专用工具了,所有代码能直接模拟的流程,都毫无意义,因为看懂你的逻辑了,就那几个函数调用来调用去,有啥意义,浏览器做啥,我工具就跟着做啥。

当年虾米音乐在 flash 播放器里 n 层算法,可以得出 mp3 地址,被我破解之后,写个批量下载工具也就半小时的功夫。

而图形验证码虽然也能破解,但因为涉及图形算法、或者人工打码,无论是效率还是复杂度,都大大提升。
laziji
2018-07-17 13:45:23 +08:00
@bk201 看代价的变化啊
原先提交一次请求是不是只需要取出字典中的一个密码 加密 然后提交 ?
现在是不是要 经过 10000 次加密后 解密得到密钥 再提交 用什么工具 电脑性能多好没关系啊
黑客尝试密码的频率是不是降低了一万倍

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

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

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

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

© 2021 V2EX