为封闭测试版生成和/或验证App Engine的许可证密钥

时间:2012-01-15 00:56:11

标签: google-app-engine key

我将在几个月后在封闭测试状态下发布我的GAE应用程序,以便只有少数用户可以使用它,我会得到一些日期并知道在哪里以及如何改进它。我的想法是我使用密钥系统让他们访问应用程序。

我想做什么:

我希望生成一键密钥并将其与数据存储区一起存储。当用户第一次使用他的Google帐户登录该应用程序时,必须输入密钥才能激活他的帐户。

我的问题:

我之前的软件不需要这样的许可证密钥或类似软件,所以这对我来说是个新领域。你认为这是实现内测的好方法吗?我的第二个想法是生成一堆密钥并使用类似其他流行软件的系统验证它们,但我认为这是不必要的,我不想避免某人可以制作密钥。只是生成,存储,然后检查密钥是否存在于数据存储区中,将其设置为使用并激活帐户将是我的建议。

如何生成大量有效并轻松添加更多(无重复)键。我很感谢每一次经历和建议。

2 个答案:

答案 0 :(得分:2)

我使用UUID生成随机密钥:

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

来自文档:" UUID是使用加密强伪随机数生成器"生成的。

在数据存储区中生成它们的长列表,然后当用户到达以下内容时:yourapp.com/betainvite/blahblahkey,您只需检查密钥是否在表中,以及它是否为rsvp property为null(或已设置为使用日期,在这种情况下,您拒绝邀请)。

您也可以将密钥存储在您的用户身上,这样您就可以找出谁使用了每个密钥以及何时使用。

最好在按键上保留一个邀请日期,然后当你使用每个按键时,你可以将它标记为受邀者,这样你就不会加倍邀请人。

答案 1 :(得分:2)

作为对Ashley建议的改进,如果您想生成更短和/或更容易键入的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万亿)代码才能找到有效代码。如果需要,您可以以缩小搜索空间为代价缩短代码。