wCaptcha, 一个基于工作量证明的 CAPTCHA

2023-01-20 14:39:06 +08:00
 greensea

CAPTCHA 就是所谓的验证码,不过这个基于工作量证明的验证码可以不要求用户进行操作,在后台就可以默默地完成。

这个验证码的核心在于,用工作量证明的方式取代了要求用户进行一些操作,来证明客户端是一个人类。不过这个验证码其实并不能区分客户端是不是人类,它的主要目的是防止大量的恶意请求,比如爆破用户名密码、爬虫之类。

对于一个普通用户来说,花几秒钟的时间做一个计算,然后再提交表单,这是完全可以接受的,可是对于爬虫或者登录接口爆破之类的机器人来说,如果每发一个请求就要花两三秒的 CPU 时间,这就完全不可接受了。

工作量证明算法使用了不可并行加速的算法,也就是说,显卡加速是废的,多核计算也是废的(除非同时对一个接口发送多个请求,但这样的请求是非正常的,很容易过滤掉)。

网站在这里: https://wcaptcha.pingflash.com 如果担心数据安全,可以直接用源码私有化部署。

至于算法细节之类的东西,都可以在网站上找到,我就不在这里废话了。

5745 次点击
所在节点    分享创造
46 条回复
oott123
2023-01-20 14:41:23 +08:00
不如说说在浏览器端你这个提交一次要算多久,在 native 平台下要算多久
xiangyuecn
2023-01-20 14:45:41 +08:00
禁止掩耳盗铃😂
greensea
2023-01-20 14:53:21 +08:00
@oott123 浏览器用 WASM 计算,速度是原生的 1/6 。计算量是可调整的,于是在实践中可以在用户开始填写表单的时候就进行计算,花个 6s 出结果,这样对于机器人来说,每个请求就要花费 1s 的 CPU 时间
shortmund
2023-01-20 15:03:03 +08:00
抖个机灵,这个方案不环保😂
sunshower
2023-01-20 15:10:33 +08:00
标题差点以为用验证码挖矿了
zenxds
2023-01-20 15:10:50 +08:00
证明客户端是一个人类?跑一个 headless 浏览器就绕过了。另外黑产的机器性能很多都是非常好的,最后拦不住黑产反而降低了普通用户的体验,还容易被误解为挖矿
mxT52CRuqR6o5
2023-01-20 15:13:57 +08:00
对于单个验证码是不能并行,但我可以获取多个验证码去并行
greensea
2023-01-20 15:15:42 +08:00
@sunshower 其实我也是受另一个 CAPTCHA 的启发,那个 CAPTCHA 用纯 hash 的方式做计算量证明,我有点怀疑它在挖矿,不过我也没细看它的源码就是了。
@zenxds 用 headless 不如直接上原生程序,速度更快。另外这个验证码的目标是过滤掉那种需要大量发送请求的用户,对于其他类型的恶意用户是无能为力的
greensea
2023-01-20 15:21:47 +08:00
@mxT52CRuqR6o5 是的,这是一个弱点,不过在具体实践上可以做点额外的工作。

比如爆破某个账户,可以根据账户名,限制同一时间只能提交一个工作量证明,工作量证明提交之后,此前产生的所有工作量证明问题直接失效,这样就没法针对这个账户做并发请求了。

这个验证码其实也就是一个很基础的框架而已,最好还是结合业务的实际情况来适配一下,效果才好。
Jirajine
2023-01-20 15:27:18 +08:00
1/6 wasm 的性能还这么差啊
这种纯计算 效率至少不应低于现代虚拟化技术的 80%到 90%。
IvanLi127
2023-01-20 15:31:05 +08:00
这个方案配合业务做成无感知的,用户体验就挺好。要是能让 wasm 和 native 速度上相当就好了,不然感觉有点事倍功半?哈哈
patrickyoung
2023-01-20 15:34:25 +08:00
上一个这么干的已经凉了,叫 coinhash 还是什么的挖矿验证码
mcfog
2023-01-20 15:40:51 +08:00
captcha 其实是个缩写 t 是图灵的 t
把工作量证明的 w 放前面这个名字有点黑色幽默
毕竟能跑得动工作量证明的那么多计算的,反而是机器
FakerLeung
2023-01-20 17:07:29 +08:00
太不环保了。。。
greensea
2023-01-20 17:38:28 +08:00
@Jirajine @IvanLi127 我也没想到 wasm 速度居然差这么多,测试下来也是出乎我的意料。wasm 这边是直接丢进 gmp-wasm 里面计算的,具体的计算也就是连续几百万次平方取模,看起来也没什么复杂的东西会导致两边的性能差距。现在我觉得最大的可能是原生代码可以直接利用 CPU 的指令集特性,而编译成 wasm 的 gmp 只能用乘法器和除法器死算
c0xt30a
2023-01-20 17:45:05 +08:00
除非你的网站是无可替代的,不然用户真的没必要忍受 captcha 。这种在用户的浏览器上运行的 '挖矿' chapcha 尤甚。

昨晚在 techmania 购物跳转到登陆页面准备付款的时候碰到了三次 captcha 验证,然后我直接换别的网站下单了,虽然贵了几十瑞郎。
Sainnhepark
2023-01-20 18:26:06 +08:00
那为啥不直接采用延时的方式来验证呢?提交 captcha 后,服务端隔一段时延发送回确认消息,这样也不需要消耗客户端的 CPU 。
IvanLi127
2023-01-20 19:10:53 +08:00
@Sainnhepark 用延迟的话,那拿几个代理 ip 并行请求,不就绕过去了?
kisshere
2023-01-20 20:10:27 +08:00
搜索引擎蜘蛛可能会认为你在恶意挖矿
maggch97
2023-01-20 20:12:40 +08:00
@Sainnhepark 哈哈,你说的太对了。我感觉可以结贴了


@IvanLi127 两个做法是完全等价,如果有问题,那也是相互都有的问题

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

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

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

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

© 2021 V2EX