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

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

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

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

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

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

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

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

5780 次点击
所在节点    分享创造
46 条回复
jonathon523
2023-01-20 20:35:12 +08:00
这种实现是不是感觉还不如 Cloudflare 的检测浏览器是否异常的验证码呢?感觉反而会让用户体验更差。
Sainnhepark
2023-01-20 20:50:46 +08:00
@maggch97 不,并不等价,我觉得 18 楼说得有道理。比如我设定时延是 3s ,那么拿 5 个 IP 做代理,通过 captcha 的平均时间就变成了 0.6 秒,IP 越多通过 captcha 的平均时间就越快。但 OP 的这个思路就不会存在这个问题,IP 越多服务器的 CPU 占用就越高,直到满载。
greensea
2023-01-20 21:14:29 +08:00
统一回复一下大家比较关注的点:

1. 关于 CAPTCHA 太多影响体验的问题,其实这个 CAPTCHA 是可以在后台运行的,初衷之一就是为了解决需要用户交互的问题,用户开始填表单的时候就开始计算,等用户填完表单了也算完了,这时候直接提交就行,不需要输个验证码或者选个图片之类的麻烦操作

2. 这个 CAPTCHA 的核心思路是,每个请求都必须消耗一定的 CPU 资源,如果想要发起很多请求,那么就要消耗很多 CPU 资源,攻击者的成本就上去了

3. 这个 CAPTCHA 也不是什么银弹,可以一劳永逸地解决人机验证问题,它可以应付的情况仅限于恶意攻击需要发起大量请求的情况,使用场景还是有一定限制的
mason961125
2023-01-20 21:34:08 +08:00
coinhive 都倒闭几年了
learningman
2023-01-20 23:31:56 +08:00
认真的吗,Ryzen 3600 跑你的 demo 差不多得要 2 分钟
cyp0633
2023-01-21 00:15:17 +08:00
@learningman 不正常吧,我在手机浏览器上跑都不用五秒
oott123
2023-01-21 00:37:32 +08:00
1/6 太差了,至少也要 1/2 才可以接受吧。考虑到用户可能用的是个破手机,而且你的 pow 有效期不宜太长,没法真的在开始填表的时候算——否则用户提交上去的时候就过期了。
Aloento
2023-01-21 01:50:48 +08:00
我的评价是你不如拿用户的资源干点正事
AkaGhost
2023-01-21 02:12:59 +08:00
之前我用 coinbase 还是 coinhash ,总之是一个挖 XMR 的验证码,和楼主的想法完全一致。后来谁挂这个验证码,Google 就给哪个网站标红,最后还跑路了。
WuSiYu
2023-01-21 06:04:27 +08:00
之前也想过这种,不过还是不太现实,这个计算虽然单个没法并行,但也不需要,完全可以攒一堆然后批量跑。
用 GPU 一秒估计能跑几千几万个,甚至因为这个计算的访存压力极小,都能跑满理论 TOPS 性能,相比没有这个工作量证明,爬虫仅仅是多了个 GPU 的成本
lslqtz
2023-01-21 07:51:18 +08:00
1. 思路很不错, 通过提高验证成本来提高机器人的并发难度, 不过核心变成了反破解. 对于大规模批量采集, 会显著增加采集成本, 提高采集时间.
2. 理想情况下, 无论算力如何, 都应该具有相似的时间消耗, 即计算量需要是可变的, 以防止较好的硬件非常快的取得结果.
3. 关于环保问题, 顺便挖个矿其实也是非常可取的.
4. 验证码的并发限制是个很基本的东西, 配合 IP 库判定代理可以取得更好的效果.
leonshaw
2023-01-21 09:56:01 +08:00
工作量浪费了,不如直接改成用户支付一定虚拟货币才能登录
learningman
2023-01-21 11:52:29 +08:00
@cyp0633 应该是 edge 节能模式的问题? CPU 只跑了 10%左右
lambdaq
2023-01-21 12:59:57 +08:00
计算量我觉得太费电了。。有没有不费电但是需要 2G 内存的。。。?
Showfom
2023-01-21 14:50:53 +08:00
@patrickyoung #12 叫 Coinhive 已经倒闭了
iqoo
2023-01-21 15:17:05 +08:00
1/6 太低了,其实有办法 100% 的。
xenme
2023-01-21 15:32:20 +08:00
之前看到一个类似的,客户端计算耗时较长,服务端验证很快,主要是防爆破,不一定要挖矿
greensea
2023-01-21 16:39:14 +08:00
继续回复大家关注的点:

1. 关于 GPU 加速的问题,虽然说可以用 GPU 对多个工作量证明进行并行计算,但是平摊下来每条流水线的速度估计会很慢(关于这一点我没证实过,只是纯推测),这样就没法在一定时间内算出结果了。另外之前也回复过了,对于多个请求进行并发计算,这验证码是没法直接防住的,需要根据具体业务做一点额外的工作。

2. 关于是否能有不消耗 CPU 而是消耗内存的算法。这种算法肯定是有的,不过我还没有研究过,过段时间可以翻一翻论文找找。

3. 大家别看到工作量证明就想到挖矿哈,客户端算个几秒钟不算什么消耗嘛,该消耗的 CPU 还是该消耗的嘛,就像谷歌一次就要排放多少克碳,可我们该搜索也还是要搜索嘛。传统的需要交互的验证码,虽然不用消耗 CPU ,可却消耗了用户的生命不是嘛
greensea
2023-01-21 16:39:38 +08:00
@iqoo 愿闻其详,wasm 已经是我能找到的在浏览器里面计算最快的方法了
hanbing135
2023-01-21 23:20:32 +08:00
没太看懂

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

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

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

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

© 2021 V2EX