2

PHPでこれを行う方法を知っていて、最近このコードに出くわしました。私はJSが初めてです。誰かがこのコードの機能と実装方法を説明できますか? 本質的に私がしなければならないことは、私が作成しているサイトで公正なゲーム体験を提供することです。

PHP での例 (関連できるすべて): rand() を暗号化し、賭けの前にロールされた # の暗号化されたバージョンを提供し、それを client_seed に追加します。ユーザーは client_seed を変更できます。数字、つまり 59.73 を取得した後、その暗号化されたバージョンを client_seed に追加して、賭けの前に提供されたハッシュが公正であることを証明できることを確認できます。

ただし、JS や PHP ではなく JS ですべてを実装する方がはるかに簡単なので、このコードを実装する方法がわかりません。

ありがとう。

<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 がブラウザーにデプロイされている場合、真のランダム ソースは利用できません。真のランダムが必要な場合は、サーバーから取得する必要があります。このシードを簡単に置き換える方法はありません。あなたができる最善の方法は、ユーザー入力からランダム ソースを生成することですが、これも注意が必要であり、十分にランダムではない可能性があります。

サーバーで生成されたランダム シードをユーザーに与えるもう 1 つの理由は、ユーザーがチートしないようにするためです。クライアントとサーバーのシード (および nonce の開始値ですが、0 の場合もあります) がわかっている場合は、サーバーでランダム ストリーム全体を再生成できます。これは、ランダムがクライアントで生成されたシードに依存している間、クライアントが意味のある方法でランダム ストリームに影響を与えることができないことを意味します。したがって、サーバーもチートできません。残念ながら、クライアントとサーバーの両方がおそらくゲーム自体を変更する力を持っているため、これが利点をもたらすかどうかは疑問です.

于 2013-06-30T08:35:23.380 に答える