2016-03-16 139 views
0

我有一個情況我需要生成短僞隨機的字母數字標記,其是唯一的,可覈查,並且容易由人型能夠。這些將從Web應用程序中生成。這些令牌不需要非常安全 - 它們被用於愚蠢的網頁遊戲中,以獲得一個愚蠢的獎品。由於各種原因,客戶希望這些令牌具有人類可讀性,並通過電子郵件進行處理。這是不可談判的(我知道......但這是因爲我無法控制的原因)。生成短的,僞隨機可驗證字母數字代碼

換句話說,假設我們得到的代碼「ABCDE12345」

  • 必須有一個方式說「ABCDE12345」是「有效的」。例如:在開始運行時,可能會有兩到三個字符通過我編寫的算法生成剩餘字符的正確序列。例如,f("AB")==="CDE12345"

  • 兩個人玩遊戲不應該是可能產生同樣的道理。在我看來,我很樂意用毫秒+遊戲角色名稱&得分來打造自制的RNG。 (也就是說,不要使用Math.random,因爲這是一個Web應用程序)。這將播種上述的兩個或三個字符序列。

我是否缺少任何東西?我不是在尋找一個具體的算法,而是你的建議。我錯過了什麼?

+0

我假設遊戲是無狀態的,當它涉及到的代碼? (即它不能存儲已知的生成代碼)? – amit

+0

遊戲在服務器意義上是無狀態的。這就是說,它使用localStorage在玩家的設備上保留角色,得分等。 – TomorrowPlusX

回答

0

一個簡單的解決方案(並容易破解)將產生一個有意義的術語(一種方法來實現這樣的是從維基百科選擇一個隨機文章),encrypt它與一個預先知道的密碼,並採取最不重要的x位。現在

,你生成密鑰是word-<x bits as a number>

這很容易通過機器驗證,只需重新編碼該單詞並檢查這些位是否合適,並提供了可讀性與安全性(更大的x - >可讀性更低,更難以僞造)之間的簡單折衷。

這種方法雖然是假設你的遊戲是不與任何服務器通信的主要問題,您將需要以某種方式部署預共享密鑰給您的客戶,他們將能夠逆向工程了。

1

如果你認爲你的令牌相當於一個認證的消息說:「給這個人獎」你可以看看https://en.wikipedia.org/wiki/Hash-based_message_authentication_code,重新編碼與如必要https://en.wikipedia.org/wiki/Base64使這個東西可打印。當然,HMAC使用一個祕密密鑰,你必須保密。公鑰簽名系統不需要你保存密鑰的祕密,但我希望簽名更長,如果你想要非平凡的安全性,我認爲它已經太長了。