Javascript加密功能 - 它是如何工作的?

时间:2013-06-30 06:35:43

标签: javascript random cryptography

我知道如何在PHP中执行此操作,并且最近遇到了此代码。我是JS的新手。有人可以解释这段代码的作用以及如何实现它吗?基本上我需要做的是为我正在创建的网站提供可靠的公平游戏体验。

PHP中的示例(我可以参与其中):我加密rand()并在下注之前提供#ledled的加密版本并将其添加到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>

2 个答案:

答案 0 :(得分:1)

首先,此代码段本身不属于<script>。它实际上是一个属于具有node.js环境的服务器端的功能。

查看该函数,如果客户端可以访问它,那么服务器端种子有什么用处(如果它在源中,则客户端具有访问权限,如果他愿意的话。) 毕竟这是关于为用户操作生成结果。如果他能够访问它,他可以判断他是否会放松或赢得并相应地调整投注。该网站将在几分钟内破产。

crypto对象是node.js中包含的本机模块。 See the crypto.createHmac function in the docs.

我希望这可以解决一些问题。

答案 1 :(得分:0)

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

代码也不是很有效,lucky的可能性取决于被测试的数字(1000000)。现在也许这个号码可以,但是如果你输入数字2会怎样?代码不会运行那么好,基本上丢掉随机值,就像没有明天一样。

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

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

相关问题