2

我知道如何在 PHP 中做到这一点,最近遇到了这段代码。我对 JS 很陌生。有人可以解释这段代码的作用以及如何实现它吗?本质上,我需要做的是为我正在创建的网站提供可证明公平的游戏体验。

PHP 中的示例(我能想到的所有内容):我加密 rand() 并提供在投注前滚动的 # 的加密版本,并将其添加到 client_seed。用户可以更改client_seed。在他们获得数字即 59.73 后,他们可以使用 client_seed 添加该数字的加密版本,以查看这是在提供可证明公平的赌注之前提供的散列。

除了我不明白如何实现这段代码,因为在 JS 中而不是在 JS 和 PHP 中拥有一切会容易得多。

谢谢。

<script type="text/javascript">
function lucky_number(server_seed, client_seed, nonce) {
var hex_chars_to_use = 5;
var hash = crypto.createHmac('sha512', server_seed).update(client_seed + ':' + nonce.toString()).digest('hex');
var len = hash.length;

for (var i = 0; i < len; i += hex_chars_to_use) {
    var hex = hash.substring(i, i + hex_chars_to_use);
    var lucky = parseInt(hex, 16);
    if (lucky < 1000000)
        return lucky;
}

// the 26th substring will always be <4096 (3 hex digits), so we won't get here
util.log(0, 'RAN OUT OF HASH!  using ' + hash + ' - returning', 0);
return 0;
};
</script>
4

2 回答 2

1

首先,这个片段本身不属于<script>它实际上是一个与node.js环境一起属于服务器端的函数。

查看函数,如果客户端可以访问它,服务器端种子有什么用处(如果它在源中,客户端可以访问它,如果他愿意的话。)毕竟这是关于生成结果用户动作。如果他可以访问它,他可以判断他会输还是赢,并相应地调整赌注。该网站将在几分钟内破产。

crypto对象是一个包含在 node.js 中的本机模块。请参阅文档中的 crypto.createHmac 函数。

我希望这能澄清一点。

于 2013-07-01T19:04:17.817 回答
0

首先,小心使用在互联网上找到的代码。它通常没有经过充分测试或正确。例如,最后代码返回0. 但似乎有一个奇怪的机会在此之前返回。这取决于调用者接下来会发生什么 - 我只能假设nonce增加并计算下一个值。但这会从结果中忽略数字 0!

该代码也不是很有效,存在的机会lucky取决于被测试的数字(1000000)。现在也许这个数字没问题,但是如果你输入例如数字会发生什么2?代码不会运行得那么好,基本上会丢弃随机值,就像没有明天一样。

需要服务器种子的原因是 JavaScript 中随机数的可用性。当 JavaScript 部署在浏览器中时,通常没有真正的随机源可用。如果你想拥有真正的随机数,它们必须来自服务器。没有简单的方法可以替换这个种子;您能做的最好的事情就是从用户输入中生成一个随机源,但这也很棘手,而且可能不够随机。

给用户一个在服务器上生成的随机种子的另一个原因是确保用户不会作弊。如果您知道客户端和服务器种子(以及当时随机数的起始值,但很可能为 0),则在服务器上您可以重新生成整个随机流。这意味着客户端不能以任何有意义的方式影响随机流,而随机数仍然依赖于客户端生成的种子——因此服务器也不能作弊。不幸的是,客户端和服务器都可能有能力改变游戏本身,所以这是否会带来任何好处是值得怀疑的。

于 2013-06-30T08:35:23.380 回答