2013-06-30 35 views
2

我知道如何在PHP中執行此操作,並且最近遇到此代碼。我對JS很陌生。有人可以解釋這段代碼的作用和如何實現它嗎?基本上我需要做的是爲我創建的網站提供可觀的公平遊戲體驗。Javascript加密功能 - 它是如何工作的?

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> 

回答

0

首先,小心使用在互聯網上找到的代碼。它通常沒有很好的測試或正確。例如,最後代碼返回0。但在此之前似乎有一個奇怪的機會。這取決於來電者發生了什麼 - 然後我只能假設nonce增加,並計算下一個值。但是這從結果中排除了數字0!

該代碼也不是非常有效,lucky的機會取決於正在測試的數字(1000000)。現在也許這個號碼是可以的,但是如果你輸入號碼2會發生什麼?代碼不會跑得那麼好,基本上就會丟掉隨機值,就像沒有明天一樣。

需要服務器種子的原因是因爲JavaScript中的randoms的可用性。通常,在瀏覽器中部署JavaScript時,沒有真正的隨機源可用。如果你想有真正的隨機數,他們來自服務器。沒有簡單的方法來取代這個種子;你所能做的最好的是從用戶輸入中產生一個隨機源,但這也很棘手,可能不夠隨機。

給用戶在服務器上生成隨機種子的另一個原因是要確保用戶不會作弊。如果您知道客戶端和服務器種子(以及隨機數的起始值,但很可能爲0),則可以在服務器上重新生成整個隨機流。這意味着客戶端不能以任何有意義的方式影響隨機數據流,而隨機數仍然依賴於客戶端生成的種子 - 所以服務器也不能作弊。不幸的是,客戶和服務器可能都有權力改變遊戲本身,所以這是否帶來任何優勢是值得懷疑的。

+0

那麼你會建議我採取什麼課程?我有我寫的PHP代碼,它工作正常,但我的問題是,當他們點擊滾動,它刷新頁面。我希望它給滾動的無刷新刷新,然後更新餘額(例如,他們有.001和0.0001我想讓它自動更新爲.0009,如果它是一個損失或0.0011,如果它是一個勝利)。我會用什麼JS來做到這一點? – user2534566

+1

一個不太有用的答案是在繼續之前創建一個安全協議。代碼不是你最初的問題,你的問題是不瞭解問題空間,並理解可以使其安全的解決方案。您必須首先開發和驗證協議(從您的用例開始,然後是設計,圍繞設計的線程模型等)。正如你可能理解的,這超越了Stackoverflow,並且有許多陷阱。 –

+0

然後,如果您只想創建一個版本,客戶端只需在本地生成足夠隨機的隨機數,那麼您應該簡單地在請求之間保存PRNG的狀態。這並不是一個安全的協議,但它可能足以滿足您的情況。 –

1

首先,這段代碼本身不屬於<script>。它實際上是一個屬於服務器端的功能,具有node.js環境。

綜觀功能,有什麼用處將在服務器端的種子是很好的,如果客戶端可以訪問它(如果它在源中,客戶端訪問它,如果他想。) 畢竟這是關於產生用戶行爲的結果。如果他有權使用它,他可以判斷他是否會失去或贏得並相應地調整賭注。該網站將在幾分鐘內破產。

crypto對象是包含在node.js中的本機模塊。See the crypto.createHmac function in the docs.

我希望這可以清理一些東西。