ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Cap 的 HashWX 抗 GPU 工作量证明:协议原理、成本分析与实战配置

Cap 的 HashWX 抗 GPU 工作量证明:协议原理、成本分析与实战配置 网络安全应用安全后端【免费下载链接】capFree, open-source and self-hosted CAPTCHA alternative to reCAPTCHA. Privacy-first and powered by proof-of-work and instrumentation challenges.项目地址https://gitcode.com/gh_mirrors/cap13/cap点击查看免费下载HashWX 是 Cap 默认的 challenge 协议通过为每个 challenge 动态生成全新的单向哈希函数把 GPU 相对 CPU 的算力优势从 SHA-256 的约 150 倍压缩到约 2 倍。本文将结合仓库源码完整讲解 HashWX 的设计动机、数学协议、四大 GPU 抗性特性、服务端与客户端成本实测以及在 cap-core 与 Cap Standalone 中的启用配置方法。为什么需要 HashWX工作量证明的瓶颈在吞吐量而非延迟SHA-256 型 proof of work 的根本问题在于吞吐量。GPU 以数千条 lane 锁步lockstep执行同一个固定函数因此每秒能解出的 challenge 数量远超 CPU。而对反机器人而言攻击者并不关心单个 challenge 耗时多久只关心每小时能清掉多少条——单位时间解题数才是关键指标。Cap 此前用 RSW time-lock 谜题实现这一层防护。RSW 赢在时延单个谜题内部的顺序平方无法并行但它在吞吐量上惨败——GPU 可以同时跑数千个相互独立的谜题。以普通消费级 GPU 为基准对比数值来源见 hashwx.md 与英文版 docs/guide/hashwx.md算法CPURyzen 3700X16 线程GPURTX 5060 TiGPU 优势SHA-25641 MH/s6150 MH/s~150xRSW26 H/s4400 H/s~170xHashWX2.8 MH/s5.8 MH/s~2x该组数据出自 HashWX 设计者 tevador他也是 RandomX 与 HashX 的作者的非公开 CUDA 实现Cap 团队独立复现了 RSW 行M3 单线程实测 2.112 H/s对应 Ryzen 16 线程约 26 H/s。注意 RSW 已被弃用它仍可按 key 选择、旧 key 也可继续工作但不建议用于新部署。既然 GPU 每秒能清掉约 170 倍于 CPU 的 RSW 谜题它已经失去了当初引入时想要的 GPU 抗性。协议工作原理铸造Mint无密钥材料、无预计算服务端随机取 32 字节作为 challengeC并指定难度d。整个铸造过程不含任何密钥材料、不做任何预计算本质上只是一次随机数读取 一次 JWT 签名。客户端会收到C、d以及n——每个由 seed 生成的哈希函数所覆盖的 nonce 数量。客户端求解逐块共享哈希函数客户端需要找到一个 64 位 nonceN使得H(N) (2^64 - 1) / d where H hashwx_make(sha256(C || u64le(N / n)))每连续n个 nonce 组成一个块共用同一个生成的哈希函数。客户端构建该函数、跑完整个块若块内没有任何值低于目标值则推进到下一块。期望工作量即为d次哈希。Cap 使用n 65536参考协议在原生客户端用 463。浏览器环境下每个块都必须通过WebAssembly.Module做 JIT 编译块越大越能摊薄这部分开销。tevador 明确指出这一权衡每个函数覆盖的 nonce 越多协议就越容易受 JIT 编译型 GPU kernel 影响在此设定下维持 GPU 抗性的是分歧分支divergent branching。上文 ~2x 的数据就是在 65536 下测得的已包含此效应。源码侧core/src/hashwx.js 定义了整套参数与边界seed 与 challenge 均为 32 字节DEFAULT_HASHWX_NONCES_PER_HASH 65536、DEFAULT_HASHWX_DIFFICULTY 1_000_000、DEFAULT_HASHWX_CHALLENGE_COUNT 4上限分别为MAX_HASHWX_DIFFICULTY 1_000_000_000、MAX_HASHWX_NONCES_PER_HASH 1_048_576、MAX_HASHWX_CHALLENGE_COUNT 64。同文件中hashwxSeed(challenge, block)将 challenge 与 8 字节小端块索引拼接后取 SHA-256得到 32 字节 seedhashwxTarget(difficulty)计算U64_MAX / d作为目标值verifyHashwxSolution则按提交的 nonce 反推块索引、重建 seed 与函数、单次执行并比较结果。四大 GPU 抗性特性以下四条特性均出自 tevador 的 HashWX 设计文档由四者共同决定抗 GPU 能力32 个程序 概率 1/2 的自循环分支每个实例由 32 个程序组成每个程序是一个以 1/2 概率跳回自身起点的循环精确折算为每次哈希 256 次分支。CPU 上只是几次分支预测失败GPU 上却会把 warp 拆成必须依次执行的分歧路径。16 KB 非对齐 scratchpadscratchpad 的读取被刻意设计为非对齐。CPU 将其保持在 L1 并用指令重排隐藏 34 周期延迟GPU 必须放入由 L2 支撑的 local memory约 100 周期且大多数 GPU 架构需要用两次相邻读取来模拟非对齐读。浅层/深层交错寄存器列表源寄存器从交错的浅层与深层列表中选取CPU 平均处理 2.75 次依赖加载GPU 解释器则必须针对深层列表特化——约 95% 的情况下 warp 中至少有一个线程在跑深层程序于是每次都吃满 6 层依赖加载链。指令集收敛于 WebAssembly 1.0仅保留 64 位乘法、加、减、XOR、OR、旋转与移位配 6 位立即数。这正是同一算法能在浏览器中运行的根因也意味着抗 GPU 特性不是靠特殊指令而是靠控制流与访存模式。服务端验证程序生成比 HashX 便宜约 5 倍服务端从C与提交 nonce 蕴含的块索引重算 seed生成那一个哈希函数、执行一次、与目标值比较即可。HashWX 的程序生成成本比 HashX 便宜约 5 倍这是验证端能维持在数十微秒量级的原因。成本服务端、客户端与浏览器/手机实测服务端成本在 Apple M3 单核上、经validateChallenge各测 200 次铸造与 40 次验证取中位数数据来源 hashwx.md协议铸造验证合计HashWX1 个 challenge14 µs40 µs54 µsHashWX4 个子 challenge默认20 µs129 µs149 µsSHA-25650 challenge难度 44 µs83 µs87 µsRSWt 75,0001522 µs14 µs1536 µs单个 HashWX challenge 是三者中往返成本最低的默认的 4 子 challenge 拆分约 150 µs高于 SHA-256 但仅为 RSW 的十分之一RSW 每次铸造都要付四次真实的模幂运算。难度不影响这些数字——验证无论找得多难都只是每个子 challenge 一次哈希。客户端成本与拆分的统计学意义单 challenge 的求解时间呈指数分布相当于抽奖同一难度下某访客 30 毫秒解出下一位却要 3 秒。因此 Cap 默认把难度拆成 4 个子 challenge 以拉平求解时间M3 8 核、Chrome 稳定版、每档 72 次求解、两档难度中位数对齐1 challenged 1,330,0004 个子 challenged 1,000,000中位数536 ms490 msp901447 ms778 ms72 次中最慢2378 ms1490 ms右列即默认配置对 Standalone key 实测中位数 578 ms、p90 约 0.9 秒。拆分并不改变攻击者付出的代价——无论怎么切期望工作量都是d次哈希。改变的是分布形状单 challenge 的中位数是均值的 0.69 倍4 个子 challenge 把中位数推到约 0.92 倍均值并缩短尾部。因此同一难度下拆分让典型求解慢约三分之一、p90 降约四分之一。上表改为固定中位数使拆分方案省掉 25% 的难度也让攻击者每次求解少付 25% 工作量。widget 自身开销很小worker 每 16 ms 检查一次是否该停止这正是子 challenge 之间交接耗时的上界。对应实现见 widget/src/src/worker.jsHASHWX_CLOCK_EVERY 256每 256 次哈希检查一次时钟、HASHWX_YIELD_MS 16让出宏任务间隔、HASHWX_PROGRESS_MS 150进度回报间隔。浏览器引擎对比wasm 构建约达到原生速度的 60%。单 worker 下三大引擎接近全核满载时 Safari 掉队M3 同一会话内实测各浏览器 headless 或前台运行引擎1 worker8 workers退回解释模式Chrome 153440 KH/s2050 KH/s94 KH/sFirefox 156420 KH/s1850 KH/s105 KH/sSafari 27.2410 KH/s1480 KH/s105 KH/s单 worker 下三者差距在 5% 以内8 worker 时 Safari 约为 Chrome 的 70%。所以应按 Safari 调难度d 1,000,000 时 Chrome 均值约 0.5 秒、Safari 约 0.7 秒。自测建议务必用各浏览器的稳定版构建并保持标签页在前台。Playwright 自带 Firefox 跑所有 WebAssembly 任务都比稳定版慢 36 倍不止 HashWX后台标签页可能被调度到能效核所有数字直接减半。手机实测与调参建议真实手机BrowserStack默认难度、每台 15 次、Vivo 30 次每次从刚加载的新页面开始模拟访客刚到达。若页面已跑满一分钟 HashWXPixel 6 单次求解时间少 24%、Vivo 少 29%——先预热再测会得到更好看的数字。设备系统全核中位数最慢Galaxy S24Android 141238 KH/s1.1 秒1.8 秒Pixel 9Android 15837 KH/s1.4 秒2.0 秒Pixel 6Android 12746 KH/s1.9 秒2.4 秒iPhone 15iOS 17未测1.9 秒4.3 秒iPhone 12iOS 17620 KH/s2.0 秒3.3 秒iPhone 13iOS 15678 KH/s2.2 秒4.1 秒iPhone SE 2022iOS 15588 KH/s2.4 秒4.0 秒Redmi Note 11Android 11456 KH/s2.4 秒4.8 秒Galaxy M32Android 11444 KH/s2.8 秒6.1 秒Vivo Y21Android 11316 KH/s5.9 秒11.0 秒每次求解含两次到测试服务器的往返各设备中位数 80190 ms。Vivo廉价 Android约为 M3 桌面机的十倍。如果主要流量来自移动端请降低难度求解时间与难度成正比难度设为 500,000 时上表所有数字中的计算部分约减半。无 WebAssembly 的客户端完全无法求解 HashWX 并会收到错误。需要支持这类客户端时请改用带纯 JS 回退的 SHA-256 proof of workiPhone 上 widget 需要 iOS 15 及以上。HashWX 不防什么与 RSW 相同的盲区专用芯片。为此定制的 FPGA/ASIC 依然能压过 CPU。从经济学上看ASIC 的数百万美元一次性工程成本令其不适合 CAPTCHA 农场但这并非密码学层面的保证。它同样挡不住真人代答农场——现在和将来都不行。proof of work 只能抬高单请求成本请务必与 instrumentation challenge 搭配使用以便同时要求真实浏览器环境。如何在项目中启用 HashWXcap-coreformat 2 与显式协议选择在 cap-core 中 HashWX 是可选的SHA-256 PoW 仍是默认。自 v0.1.1 起widget 需 v0.1.51通过 format 2 API 启用import { generateChallenge, validateChallenge } from capjs-core; const SECRET process.env.CAP_SECRET; app.post(/api/challenge, async () { return await generateChallenge(SECRET, { format: 2, protocols: [hashwx, instrumentation], hashwxDifficulty: 1_000_000, // 可选此为默认值 }); }); app.post(/api/redeem, async (req) { return await validateChallenge(SECRET, req.body, { consumeNonce }); });HashWX 不需要密钥材料、零启动配置。首次验证会编译内置 WebAssembly 模块耗时数毫秒建议启动时调用hashwxReady()把这部分移出首个请求实现见 core/src/hashwx.js 的hashwxReady它将hashwx_alloc与内置 base64 wasm 的解码、编译、实例化结果缓存为单例 promise。hashwxDifficulty是期望客户端完成的哈希次数被拆成hashwxChallengeCount个相互独立的子 challenge默认 4。单 challenge 求解时间呈指数分布——一位访客等 30 毫秒下一位等 3 秒相同总难度下拆成 4 份可将 p90 降约四分之一、中位数变慢约三分之一因为攻击者的期望工作量仍是d次哈希客户端成本细节见上文。每增加一个子 challenge验证大约多 20 µs。还可传hashwxNoncesPerHash默认 65_536。完整参数表参数默认值合法范围hashwxDifficulty1_000_00011_000_000_000corehashwxChallengeCount4164hashwxNoncesPerHash65_53611_048_576Cap Standalone新 key 的默认协议在 Standalone 配置 中HashWX 是新 key 的默认challenge 协议按站点 key 独立配置个别 key 可用 SHA-256其余保持 HashWX在 HashWX 成为默认之前创建的 key 维持原协议直到你手动修改。切换入口在 key 的Configuration标签页 →Challenge protocol。难度由HashWX difficulty滑杆控制即期望客户端计算的哈希次数默认1_000_000、拆成 4 个子 challenge实测 Chrome 8 核桌面中位数 578 ms、手机 1.15.9 秒调高前先看上面的手机实测。合法范围50_0005_000_000由 standalone/src/cap.js 的MIN_HASHWX_D 50_000、MAX_HASHWX_D 5_000_000与DEFAULT_HASHWX_D 1_000_000定义铸造时Math.min(MAX, Math.max(MIN, round(rawD)))钳制越界值。配套的端到端测试见 standalone/test/hashwx-routes.test.js覆盖默认 4 子 challenge 的铸造与难度均分、合法 nonce 放行、off-by-one nonce / 缺解 / 乱序 / 畸形 nonce / 重放 token 拒绝、客户端篡改难度被忽略、以及 HashWX 与 instrumentation 的组合。widget 会自动从线格式识别协议format 2 响应中的protocol: hashwx因此切换 key 是唯一需要做的改动。浏览器端求解在 widget/src/src/worker.js 的solveHashwx中实现按C与块索引算 SHA-256 seed、hashwx_make生成函数、有 JIT 编译能力时经hashwx_module/hashwx_module_size提取字节并实例化旁路执行否则退回解释模式每个块按 worker 索引分片命中目标即回报 nonce。wasm 模块本身由 widget 从CAP_CUSTOM_HASHWX_URL或默认 CDN 拉取widget/src/src/cap.js 的getHashwxModule仓库同时内置了降级到 WebAssembly 1.0 的参考构建 core/src/hashwx-wasm.js。最后重申取舍HashWX 不是密码学承诺它把 GPU 优势压到约 2 倍、把攻击者单请求成本抬到期望d次哈希——配合 instrumentation 要求真实浏览器环境才构成完整的反自动化防线。赞分享网络安全应用安全后端【免费下载链接】capFree, open-source and self-hosted CAPTCHA alternative to reCAPTCHA. Privacy-first and powered by proof-of-work and instrumentation challenges.项目地址https://gitcode.com/gh_mirrors/cap13/cap点击查看免费下载相关推荐Cap 的 HashWX 工作量证明GPU 抗性挑战协议的原理、成本与配置实战Cap 的 HashWX 工作量证明GPU 抗性挑战协议的原理、成本与配置实战 HashWX 是开源项目 Cap 的默认挑战协议也是其对抗 GPU 算力碾压网络安全应用安全后端Stable Diffusion WebUI Forge 完整指南快速出图搭好你的 AI 图像生成工作站Stable Diffusion WebUI Forge 完整指南快速出图搭好你的 AI 图像生成工作站 Stable Diffusion WebUI Fo网络安全应用安全后端Cap 项目 HashWX 实战指南GPU 抗性 Proof-of-Work 的原理、成本与配置Cap 项目 HashWX 实战指南GPU 抗性 Proof of Work 的原理、成本与配置 HashWX 是 Cap免费开源、可自托管的 reCAPT网络安全应用安全后端上一篇Tsuru平台备份策略自动化与测试恢复流程下一篇django-debug-toolbar多数据库路由复杂查询调试技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表