CAPTCHA 就是所谓的验证码,不过这个基于工作量证明的验证码可以不要求用户进行操作,在后台就可以默默地完成。
这个验证码的核心在于,用工作量证明的方式取代了要求用户进行一些操作,来证明客户端是一个人类。不过这个验证码其实并不能区分客户端是不是人类,它的主要目的是防止大量的恶意请求,比如爆破用户名密码、爬虫之类。
对于一个普通用户来说,花几秒钟的时间做一个计算,然后再提交表单,这是完全可以接受的,可是对于爬虫或者登录接口爆破之类的机器人来说,如果每发一个请求就要花两三秒的 CPU 时间,这就完全不可接受了。
工作量证明算法使用了不可并行加速的算法,也就是说,显卡加速是废的,多核计算也是废的(除非同时对一个接口发送多个请求,但这样的请求是非正常的,很容易过滤掉)。
网站在这里: https://wcaptcha.pingflash.com 如果担心数据安全,可以直接用源码私有化部署。
至于算法细节之类的东西,都可以在网站上找到,我就不在这里废话了。
![]() | 1 oott123 2023-01-20 14:41:23 +08:00 不如说说在浏览器端你这个提交一次要算多久,在 native 平台下要算多久 |
![]() | 2 xiangyuecn 2023-01-20 14:45:41 +08:00 禁止掩耳盗铃 |
![]() | 3 greensea OP @oott123 浏览器用 WASM 计算,速度是原生的 1/6 。计算量是可调整的,于是在实践中可以在用户开始填写表单的时候就进行计算,花个 6s 出结果,这样对于机器人来说,每个请求就要花费 1s 的 CPU 时间 |
![]() | 4 shortmund 2023-01-20 15:03:03 +08:00 抖个机灵,这个方案不环保 |
![]() | 5 LemonZest 2023-01-20 15:10:33 +08:00 via Android 标题差点以为用验证码挖矿了 |
![]() | 6 zenxds 2023-01-20 15:10:50 +08:00 ![]() 证明客户端是一个人类?跑一个 headless 浏览器就绕过了。另外黑产的机器性能很多都是非常好的,最后拦不住黑产反而降低了普通用户的体验,还容易被误解为挖矿 |
7 mxT52CRuqR6o5 2023-01-20 15:13:57 +08:00 对于单个验证码是不能并行,但我可以获取多个验证码去并行 |
![]() | 8 greensea OP |
![]() | 9 greensea OP @mxT52CRuqR6o5 是的,这是一个弱点,不过在具体实践上可以做点额外的工作。 比如爆破某个账户,可以根据账户名,限制同一时间只能提交一个工作量证明,工作量证明提交之后,此前产生的所有工作量证明问题直接失效,这样就没法针对这个账户做并发请求了。 这个验证码其实也就是一个很基础的框架而已,最好还是结合业务的实际情况来适配一下,效果才好。 |
10 Jirajine 2023-01-20 15:27:18 +08:00 1/6 wasm 的性能还这么差啊 这种纯计算 效率至少不应低于现代虚拟化技术的 80%到 90%。 |
![]() | 11 IvanLi127 2023-01-20 15:31:05 +08:00 via Android 这个方案配合业务做成无感知的,用户体验就挺好。要是能让 wasm 和 native 速度上相当就好了,不然感觉有点事倍功半?哈哈 |
12 patrickyoung 2023-01-20 15:34:25 +08:00 via iPhone 上一个这么干的已经凉了,叫 coinhash 还是什么的挖矿验证码 |
![]() | 13 mcfog 2023-01-20 15:40:51 +08:00 via Android ![]() captcha 其实是个缩写 t 是图灵的 t 把工作量证明的 w 放前面这个名字有点黑色幽默 毕竟能跑得动工作量证明的那么多计算的,反而是机器 |
![]() | 14 FakerLeung 2023-01-20 17:07:29 +08:00 太不环保了。。。 |
![]() | 15 greensea OP |
![]() | 16 c0xt30a 2023-01-20 17:45:05 +08:00 除非你的网站是无可替代的,不然用户真的没必要忍受 captcha 。这种在用户的浏览器上运行的 '挖矿' chapcha 尤甚。 昨晚在 techmania 购物跳转到登陆页面准备付款的时候碰到了三次 captcha 验证,然后我直接换别的网站下单了,虽然贵了几十瑞郎。 |
![]() | 17 Sainnhepark 2023-01-20 18:26:06 +08:00 via Android 那为啥不直接采用延时的方式来验证呢?提交 captcha 后,服务端隔一段时延发送回确认消息,这样也不需要消耗客户端的 CPU 。 |
![]() | 18 IvanLi127 2023-01-20 19:1:53 +08:00 via Android @Sainnhepark 用延迟的话,那拿几个代理 ip 并行请求,不就绕过去了? |
![]() | 19 kisshere 2023-01-20 20:10:27 +08:00 via Android 搜索引擎蜘蛛可能会认为你在恶意挖矿 |
20 penzi 2023-01-20 20:12:40 +08:00 via Android |
![]() | 21 jonathon523 2023-01-20 20:35:12 +08:00 via Android 这种实现是不是感觉还不如 Cloudflare 的检测浏览器是否异常的验证码呢?感觉反而会让用户体验更差。 |
![]() | 22 Sainnhepark 2023-01-20 20:50:46 +08:00 via Android @maggch97 不,并不等价,我觉得 18 楼说得有道理。比如我设定时延是 3s ,那么拿 5 个 IP 做代理,通过 captcha 的平均时间就变成了 0.6 秒,IP 越多通过 captcha 的平均时间就越快。但 OP 的这个思路就不会存在这个问题,IP 越多服务器的 CPU 占用就越高,直到满载。 |
![]() | 23 greensea OP ![]() 统一回复一下大家比较关注的点: 1. 关于 CAPTCHA 太多影响体验的问题,其实这个 CAPTCHA 是可以在后台运行的,初衷之一就是为了解决需要用户交互的问题,用户开始填表单的时候就开始计算,等用户填完表单了也算完了,这时候直接提交就行,不需要输个验证码或者选个图片之类的麻烦操作 2. 这个 CAPTCHA 的核心思路是,每个请求都必须消耗一定的 CPU 资源,如果想要发起很多请求,那么就要消耗很多 CPU 资源,攻击者的成本就上去了 3. 这个 CAPTCHA 也不是什么银弹,可以一劳永逸地解决人机验证问题,它可以应付的情况仅限于恶意攻击需要发起大量请求的情况,使用场景还是有一定限制的 |
24 mason961125 2023-01-20 21:34:08 +08:00 via Android coinhive 都倒闭几年了 |
![]() | 25 learningman 2023-01-20 23:31:56 +08:00 认真的吗,Ryzen 3600 跑你的 demo 差不多得要 2 分钟 |
26 cyp0633 2023-01-21 00:15:17 +08:00 via Android @learningman 不正常吧,我在手机浏览器上跑都不用五秒 |
![]() | 27 oott123 2023-01-21 00:37:32 +08:00 via Android 1/6 太差了,至少也要 1/2 才可以接受吧。考虑到用户可能用的是个破手机,而且你的 pow 有效期不宜太长,没法真的在开始填表的时候算否则用户提交上去的时候就过期了。 |
![]() | 28 Aloento 2023-01-21 01:50:48 +08:00 我的评价是你不如拿用户的资源干点正事 |
29 AkaGhost 2023-01-21 02:12:59 +08:00 via Android 之前我用 coinbase 还是 coinhash ,总之是一个挖 XMR 的验证码,和楼主的想法完全一致。后来谁挂这个验证码,Google 就给哪个网站标红,最后还跑路了。 |
![]() | 30 WuSiYu 2023-01-21 06:04:27 +08:00 之前也想过这种,不过还是不太现实,这个计算虽然单个没法并行,但也不需要,完全可以攒一堆然后批量跑。 用 GPU 一秒估计能跑几千几万个,甚至因为这个计算的访存压力极小,都能跑满理论 TOPS 性能,相比没有这个工作量证明,爬虫仅仅是多了个 GPU 的成本 |
![]() | 31 lslqtz 2023-01-21 07:51:18 +08:00 via iPhone 1. 思路很不错, 通过提高验证成本来提高机器人的并发难度, 不过核心变成了反破解. 对于大规模批量采集, 会显著增加采集成本, 提高采集时间. 2. 理想情况下, 无论算力如何, 都应该具有相似的时间消耗, 即计算量需要是可变的, 以防止较好的硬件非常快的取得结果. 3. 关于环保问题, 顺便挖个矿其实也是非常可取的. 4. 验证码的并发限制是个很基本的东西, 配合 IP 库判定代理可以取得更好的效果. |
32 leonshaw 2023-01-21 09:56:01 +08:00 ![]() 工作量浪费了,不如直接改成用户支付一定虚拟货币才能登录 |
![]() | 33 learningman 2023-01-21 11:52:29 +08:00 via Android @cyp0633 应该是 edge 节能模式的问题? CPU 只跑了 10%左右 |
![]() | 34 lambdaq 2023-01-21 12:59:57 +08:00 计算量我觉得太费电了。。有没有不费电但是需要 2G 内存的。。。? |
![]() | 35 Showfom PRO @patrickyoung #12 叫 Coinhive 已经倒闭了 |
![]() | 36 iqoo 2023-01-21 15:17:05 +08:00 1/6 太低了,其实有办法 100% 的。 |
37 xenme 2023-01-21 15:32:20 +08:00 via iPhone 之前看到一个类似的,客户端计算耗时较长,服务端验证很快,主要是防爆破,不一定要挖矿 |
![]() | 38 greensea OP 继续回复大家关注的点: 1. 关于 GPU 加速的问题,虽然说可以用 GPU 对多个工作量证明进行并行计算,但是平摊下来每条流水线的速度估计会很慢(关于这一点我没证实过,只是纯推测),这样就没法在一定时间内算出结果了。另外之前也回复过了,对于多个请求进行并发计算,这验证码是没法直接防住的,需要根据具体业务做一点额外的工作。 2. 关于是否能有不消耗 CPU 而是消耗内存的算法。这种算法肯定是有的,不过我还没有研究过,过段时间可以翻一翻论文找找。 3. 大家别看到工作量证明就想到挖矿哈,客户端算个几秒钟不算什么消耗嘛,该消耗的 CPU 还是该消耗的嘛,就像谷歌一次就要排放多少克碳,可我们该搜索也还是要搜索嘛。传统的需要交互的验证码,虽然不用消耗 CPU ,可却消耗了用户的生命不是嘛 |
40 hanbing135 2023-01-21 23:20:32 +08:00 没太看懂 |
![]() | 42 devliu1 2023-01-23 21:54:44 +08:00 https://github.com/mCaptcha/mCaptcha 另一个开源的 PoW Captcha 方案 |
![]() | 43 greensea OP |
![]() | 46 RadishWind 2023-02-20 16:07:28 +08:00 赞, 最近在学习 web3, 发现之前 coinhive 的验证码用的好像就是类似的技术 刚好找到了楼主的帖子 |
![]() | 47 0xD800 2024-07-08 21:50:41 +08:00 赞,QQ 就有一个 TLV 是这种思路,哈哈要计算很多次 sha ,感觉不如你这个好 |