博客 · 公平与反作弊知识库

可验证公平扑克里的重放攻击:为什么旧证明不能重复使用

公平与验证 发布于 2026 年 10 月 30 日 · Fair Poker 研究团队

很多人搜“可验证公平扑克 重放攻击”,其实是在问一个很实际的问题:一份以前真实有效的证明,会不会被拿来冒充另一手牌的证明?在安全领域,重放攻击通常指把旧的有效消息、签名或证明重新发送,让系统误以为它属于现在这个场景。

放到线上德州扑克里,重点不是某一个技术词能解决一切。真正重要的是:每一手牌的证明,必须绑定自己的牌局编号、桌子、玩家、承诺、计数器、揭示时间和验证步骤。公平证明应该只属于这一手牌,不能像通用优惠券一样重复用。

什么是重放攻击

OWASP 在重放攻击防护里提到,系统通常需要唯一值、时间限制和明确校验,避免旧消息再次被接受:OWASP replay vulnerabilities。说白了,系统要能分辨“这是现在这一次”,还是“以前那一次被拿来重放”。

扑克公平证明也有同样的问题。一份洗牌记录可能包含承诺、种子、nonce、发牌结果、行动顺序和手牌编号。如果这些内容没有绑在一起,坏掉的系统或不诚实的平台就可能把 A 手牌的证据拿来包装成 B 手牌的证据。

所以,验证不能只问“这个哈希对不对”。还要问:“这个哈希是不是属于这一手牌、这张桌子、这个计数器、这个揭示时间?”

为什么扑克证明必须带上下文

一手德州扑克不是一次简单抽奖。玩家入座、手牌编号增加、盲注发生、随机输入生成、牌被发出、玩家依次行动,最后某些信息才可以公开。验证记录也应该保留这个顺序。

比如,一个服务器种子的承诺可能是真的,但这不等于它一定属于你正在查的那手牌。它还需要和手牌 ID、唯一计数器、之后揭示出来的值对应起来。基础流程可以看这篇:commit-reveal poker shuffle。

玩家贡献的随机值也一样。如果玩家种子、浏览器随机数或行动签名可以被放到另一手牌里重复使用,整份证明就变弱了。好的系统会让每个贡献都只属于某一手牌、某一个步骤。

nonce、计数器和新鲜随机数

NIST 的术语表把 nonce 解释为在特定环境里只使用一次的值:NIST nonce glossary。在扑克里,它可以是手牌计数器、洗牌步骤编号、揭示编号,或者其他不能重复的值。

nonce 不一定是秘密。它最重要的是在该唯一的地方保持唯一。公开的手牌编号可以有用,前提是证明里真的包含它。隐藏的随机种子也可以有用,前提是先承诺、后揭示。这两个任务不同,混在一起解释就容易出问题。

新鲜随机数也很重要。浏览器里常见的 Web Crypto 能提供加密意义上的强随机值;MDN 对 crypto.getRandomValues() 的说明是,它会填充加密强度随机值:MDN getRandomValues。扑克里的 nonce 解释可以看:nonce in provably fair poker。

一份防重放的公平证明,就像一张写清座位、日期、场次和验票记录的票。票本身可以是真的,但它不应该永远打开所有门。

玩家可以看什么

普通玩家不需要逐行看源码,可以看这些简单信号:

如果网站只给一个绿色对勾,那证据比较弱。更好的系统会给你足够信息,让你能重放验证流程,看清每个值属于哪里。可参考:provably fair poker checklist。

诚实的边界

防重放能让公平证据绑定正确的手牌,但它不能解决所有作弊。玩家仍可能在桌外合谋,账号仍可能被盗,机器人仍需要单独检测。所以,密码学公平和反作弊治理必须一起做。

简单标准就是:旧的有效证明,不应该对新手牌仍然有效。如果一份记录能把这件事讲清楚,可验证公平扑克就更容易被玩家检查,也更难用回收证据来伪装。

对可验证公平的实现方式感兴趣?

Fair Poker 是研究德州扑克可验证公平的非营利开源项目:牌堆由参与者浏览器共同加密洗牌,没有发牌服务器,每一手都可独立验证。项目不对公众提供游戏服务;全部源码公开,欢迎下载后在自己的电脑上搭建研究。

下载源码自行研究

本站为非营利开源研究项目,不对公众提供游戏服务;演示仅限研究测试且只用无价值测试筹码,非真钱赌博。本文为教育性内容,不构成任何投注建议。

← 返回文章列表