根据 Hashcash 做的 反机器人 CC 攻击算法

2014-12-24 04:20:28 +08:00
 typcn

我想了想还是单独贴出来让更多的人看到,大家一起看一下可行性以及是否存在问题。

体验可以到这里 http://blog.eqoe.cn/ 在右边进行搜索

我们可以看到点击搜索的时候客户端发送了 3 次请求。

客户端计算 Hash 示例代码

var tk = "获得的TOKEN内容";
var str = 10000;
var lasthash = "";
while(lasthash.indexOf("0000") != 0){ //如果 lasthash 前4位不是0则持续循环
    str++;
    lasthash = sha1(tk+str.toString()); //把 Token 和 数字拼接起来
}; //经过多次测试 PC端计算大约需要1-3秒 移动端需要2-5秒

如果需要的话你可以对我的 blog 进行压力测试,别打太狠就行。。。

假设使用 C 语言制作客户端计算一个 Hash 需要 2 秒,攻击者使用 16 核电脑和若干代理IP,那么你的服务器每秒只会收到 8 个以下的请求,这种算法应对一般的攻击应该可以无压力的防住吧?

6767 次点击
所在节点    分享创造
51 条回复
procen424
2014-12-24 08:53:44 +08:00
楼主找个强一点的工作量证明算法吧
SHA1用显卡或FPGA跑 会把CPU虐哭的
而且都是现成的代码
icedx
2014-12-24 09:37:05 +08:00
博客是WP?
lijun20020229
2014-12-24 09:51:38 +08:00
比特币的工作量证明据说早就有了,1996年Adam Back开发的“Hashcash"用来反垃圾邮件。
typcn
2014-12-24 09:53:58 +08:00
@icedx 不是WP 是 node.js 自己写的
binux
2014-12-24 09:57:46 +08:00
我直接压 sha1 就完了,按照几万次 sha1 就需要1秒计算,只要我每秒请求超过几万次,你就挂了。
typcn
2014-12-24 10:00:34 +08:00
@binux 防火墙吃干饭啊。。。你1秒还没请求10次就被封IP了,而且在服务端也可以加验证,验证失败X次进行拦截,X个同段IP失败拦截IP段。
binux
2014-12-24 10:30:19 +08:00
@typcn 谁说我就一个IP了
icedx
2014-12-24 10:34:27 +08:00
@typcn 窝巢菊...
typcn
2014-12-24 10:39:38 +08:00
@binux 真要有超多IP,打静态文件也打挂了,别说仅仅是 SHA1。 还有,执行一次 sha1 比执行一次搜索耗费的资源小了无数倍
geew
2014-12-24 10:46:54 +08:00
就用户体验来说 我觉得这种方法不好 用更简单的频率限制不挺好的么 过高的频率直接打入黑名单 限制一定的时间再开放
binux
2014-12-24 10:50:56 +08:00
@typcn 比静态资源高。
typcn
2014-12-24 10:53:50 +08:00
@geew 简单的频率限制,去网上抓一堆垃圾代理,分分钟拥有几千 IP
nilai
2014-12-24 10:58:17 +08:00
@typcn 有一个问题想问你, 你一个长40 位的字符串 再后面拼接了一个 1--10000的随机数 再进行sha1加密, 生成的这1万个hash中。 一定会有一个hash的前4位为0么?
typcn
2014-12-24 10:58:22 +08:00
@binux 静态资源也会发生散列哈希运算,磁盘读取之后,计算服务器上文件的 ETag ,将 header 等信息发送给用户。
大部分静态资源服务器有这个。
typcn
2014-12-24 10:59:29 +08:00
@nilai 随机数是无限+1的,经过我的测试一般会在3秒之内得到结果
hellogbk
2014-12-24 11:00:02 +08:00
感觉客户端会卡死呢。
binux
2014-12-24 11:04:30 +08:00
@typcn 你的静态资源没有缓存吗,每次都重新计算?etag 计算量比 sha1 要小。
typcn
2014-12-24 11:17:21 +08:00
@hellogbk 浏览器会暂时无响应,但是等三秒比输入验证码好多了。

@binux 不重新计算如何知道文件变化了没有?我知道计算量小,我只是提供这一种方法,至于到底用在哪个地方合适与否就是使用者考虑的了。。比如我用在了搜索上,执行 sha1 就比执行搜索快多了,很显然可以大大减轻压力。
binux
2014-12-24 11:19:40 +08:00
其实这个是有效的,攻击找的是系统中最消耗资源的请求。
而将搜索用 sha1 验证,降低了搜索的请求消耗。
其实也不一定要用 sha1 ,关键是拉大客户端和服务器端的计算压力差,比如这里是 0xffff : 1。换成 md5 也是一样的,服务器还算得快一点。
binux
2014-12-24 11:20:04 +08:00
@typcn 实际上 nginx 是 mtime + size

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

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

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

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

© 2021 V2EX