2012-01-15 40 views
1

我將在封閉測試版狀態的幾個月內發佈我的GAE應用程序,以便只有少數用戶可以使用它,並獲得一些日期並知道在哪裏以及如何改進它。我的想法是,我使用一個關鍵系統讓他們訪問應用程序。爲封閉測試版生成和/或驗證App Engine的許可證密鑰

我想做什麼:

我要生成的密鑰的一記重拳,並將它們存儲與數據存儲。當用戶第一次使用他的Google帳戶登錄應用程序時必須輸入密鑰才能激活其帳戶。

我的問題:

我以前的軟件並不需要這樣的許可證密鑰或相似的,所以這對我來說是一個新的領域。你認爲這是實現內測的好方法嗎?我的第二個想法是生成一堆密鑰,並用像其他流行軟件這樣的系統驗證它們,但我認爲這是不必要的,我不想避免某個人可以創建密鑰。只要生成,存儲,然後檢查數據存儲中是否存在密鑰,將其設置爲使用並激活帳戶,這將是我的建議。

如何生成大量有效並輕鬆添加更多(無重複)鍵。我很感謝每一個經驗和建議。

回答

2

作爲改進阿什利的建議,如果你想生成短和/或更容易輸入ID,您可以生成一些隨機數據,並使用base32編碼是:

base64.b32encode(os.urandom(8)).strip('=') 

使它有點通過插入連字符更容易閱讀:

'-'.join(base64.b32encode(os.urandom(8)).strip('=')[5*x:5*(x+1)] for x in range(3)) 

這使您的代碼如下所示:

'C6ZVG-NJ6KA-CWE' 

然後將結果存儲在數據存儲中,並將它們發送給用戶。我建議存儲沒有連字符的代碼,並在檢查數據庫之前剝離這些字符。如果你想變得很花哨,選擇base32的字母表來避免看起來相似的字符;您可以在做檢查之前替換這些字符來解釋拼寫錯誤。

8字節的隨機數據爲您提供2^64個可能的邀請碼;如果你發放2^16(65,536)個攻擊者,攻擊者仍然需要嘗試2^48(約300萬億)代碼才能找到合適的代碼。如果你願意,你可以縮短搜索空間,縮短搜索空間。

+0

感謝您的回答。我已經在尋找更可讀的解決方案。不幸的是我用Java編寫應用程序,因爲我對Python不太熟悉。如果可能,請你更新你的答案。 – 2012-01-16 21:54:06

+1

@DominicBartl我不太清楚Java能夠輕鬆翻譯它,但步驟很簡單:1)使用安全的隨機數生成器生成8個字節的隨機數; 2)使用base32對它們進行編碼; 3)添加連字符。將來,如果你的問題是特定於語言的,你應該爲該問題添加該語言的標籤。 – 2012-01-16 23:32:05

+0

謝謝足夠的步驟,以便我可以將它翻譯成Java,是的,我應該添加一個語言標記,對不起 – 2012-01-17 07:31:49

2

我使用UUID用於生成隨機密鑰:

UUID.randomUUID().toString().replace("-", ""); 

從文檔:「使用加密的強僞隨機數發生器產生的UUID」。

在數據存儲區中生成一個很長的列表,然後當用戶到達類似於:yourapp.com/betainvite/blahblahkey時,您可以簡單地檢查該密鑰是否在表中,並且如果它的rsvp屬性爲null (或者已經設置爲使用日期,在這種情況下您拒絕邀請)。

您也可以將密鑰存儲在您的用戶身上,以便您瞭解誰使用了每個人以及何時。

也是一個好主意,以保持關鍵的邀請日期,然後當你使用每一個你可以標記爲受邀,所以你不會邀請人。

+0

最簡單的方法往往是最好的,既然你在控制生成和驗證,這種方法將工作得很好。 – 2012-01-16 01:37:35

+0

我應該補充一點,UUID實際上是帶有連字符的,並且在我的代碼中刪除它們,因爲我認爲鍵沒有連字符看起來更像_key-like_。只需從我的片段中抽取'.replace(「 - 」,「」)',以便從UUID中創建連字符。如果要縮短由UUID生成的密鑰,請添加'.substring()'。 – 2012-01-18 00:50:00

+0

請注意截斷UUID - 它們(有點)是結構化的,截斷的版本可能比您期望的要少一些獨特的信息。 – 2012-01-18 01:54:39