如果抽卡游戏用的不是密码学安全的随机数算法(我觉得大部分游戏都不是),是不是有可能从客户端控制服务器的随机抽卡结果?

343 天前
 drymonfidelia
2495 次点击
所在节点    信息安全
24 条回复
Rickkkkkkk
342 天前
@drymonfidelia 没戏。而且既然有保底,那绝对是干预了一个账户能获得东西的上下限。
liuidetmks
342 天前
@mercury233 系统提供的随机算法,不是仅仅时间作为种子吧,有一个系统熵池,各种系统调用,网络事件等等,已经足够安全了
Maboroshii
342 天前
全局一个随机种子,你怎么知道当前随机到第几个数了啊.. 所有玩家都在抽,又不是只有你一个人在抽
restkhz
342 天前
我来暴论几句。

这个问题主要取决于游戏开发怎么做的了。
可能种子才是更加关键的问题。不管你是普通 PRNG 还是 CSPRNG 都不可能真正扔一个随机数出来,必须要一个种子。问题就在这个种子这里。

操作系统一般都有一个熵池,直接从这里获取种子是最好的。
从服务器熵池生成一个随机数并且确定结果,客户端放动画,PRNG 一次一种子,这种场景是安全的。

首先客户端。
客户端那里没有安全性可言。但是对于很多游戏大量用随机的时候基本都是客户端获取。比如你打怪随机伤害,暴击的随机。至于抽卡,取决于开发怎么想的。理论上,如果你能控制比如/dev/urandom ,逆向出算法,是可以控制抽卡等结果的。但是讲道理哦,你都能做到这些了,为什么不直接修改游戏本身...直接劫持函数或者改包改存档...

服务器上用时间做种子呢?即便在服务器上这东西也不安全。有一个教科书级别的案例就是有某个 PHPbbs 的密码找回链接用的 md5(时间戳)。时间戳有多少可能呢?反正就那几种可能暴力一下就行了。一旦算法被研究出点眉目就容易出事。

好的,排除这些情况。回到楼主的问题。。

服务器生成,种子来源可靠且不可知,算法是普通 PRNG ,但是种子一直被重用,其他因素没有不太可控的,抽卡算法是可知的,那么这样我们可以通过 PRNG 的结果推算种子,的确有可能做到预测结果。如果不只是抽卡,还可以押东西,考虑赔率,那么我们就能“控制”一些东西了。

如果服务器用的是精确到毫秒的那种时间做种子,那么就像抛硬币,只要你抛够多也能有连续 100 次正面一样。如果可以预测,即便做不到精确控制时间,假设网络延迟波动不大,我们依旧能有效找到“胜率”更高的一小段时间。确保服务器在那段时间处理请求就好了。这种情况就算 CSPRNG 也没用。种子得要当密钥看。种子泄漏了不管你是不是密码学伪随机都不会安全。

上面 mc 的例子我猜测,瞎猜,是可以通过强行刷新种子并且种子可知,结果可预测才做到控制。
不好意思暴论太多了。

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

https://ex.noerr.eu.org/t/1105674

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

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

© 2021 V2EX