Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 为AppEngine生成和/或验证封闭测试版的许可证密钥_Google App Engine_Key - Fatal编程技术网

Google app engine 为AppEngine生成和/或验证封闭测试版的许可证密钥

Google app engine 为AppEngine生成和/或验证封闭测试版的许可证密钥,google-app-engine,key,Google App Engine,Key,我将在几个月后在封闭测试状态下发布我的GAE应用程序,这样只有少数用户可以使用它,我可以获得一些日期,知道在哪里以及如何改进它。我的想法是使用密钥系统让他们访问应用程序 我想做什么: 我想生成一组密钥并将它们存储在数据存储中。当用户第一次使用Google帐户登录应用程序时,必须输入密钥才能激活其帐户 我的问题: 我以前的软件不需要这样的许可证密钥或类似的密钥,所以这对我来说是一个新领域。你认为这是实现封闭测试的好方法吗?我的第二个想法是生成一组密钥,并像其他流行软件那样使用系统进行验证,但我认为

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

我想做什么:

我想生成一组密钥并将它们存储在数据存储中。当用户第一次使用Google帐户登录应用程序时,必须输入密钥才能激活其帐户

我的问题:

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

如何生成大量有效且易于添加更多(无重复)密钥。我非常感谢每一次经验和建议。

我用于生成随机密钥:

UUID.randomUUID().toString().replace("-", "");
从文档中可以看出:“UUID是使用加密强伪随机数生成器生成的”

在数据存储中生成它们的长列表,然后当用户到达yourapp.com/betainvite/blahblahkey这样的位置时,您只需检查键是否在表中,以及它的rsvp属性是否为null(或者已经设置为使用它的日期,在这种情况下,您会拒绝邀请)

您也可以针对您的用户存储密钥,这样您就可以找出谁使用了每个密钥以及何时使用

在按键上保留一个邀请日期也是个好主意,然后在使用每个按键时,可以将其标记为邀请,这样就不会双重邀请人。

我用于生成随机按键:

UUID.randomUUID().toString().replace("-", "");
从文档中可以看出:“UUID是使用加密强伪随机数生成器生成的”

在数据存储中生成一个长列表,然后当用户到达诸如:yoursapp.com/betainvite/blahblahkey时,您可以简单地检查该键是否在表中,如果是rsvp属性为null(或已设置为使用日期,在这种情况下拒绝邀请)

您也可以针对您的用户存储密钥,这样您就可以找出谁使用了每个密钥以及何时使用


在密钥上保留一个邀请日期也是一个好主意,然后当您使用每个密钥时,您可以将其标记为邀请,这样您就不会双重邀请他人。

作为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(65536)个代码,攻击者仍然需要尝试2^48(约300万亿)个代码才能找到有效的代码。如果您愿意,您可以以减少搜索空间为代价缩短代码。

作为对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(65536)个代码,攻击者仍然需要尝试2^48(约300万亿)个代码才能找到有效的代码。如果您愿意,您可以以减少搜索空间为代价缩短代码。

最简单的方法通常是最好的,因为您可以控制生成和验证,这种方法可以很好地工作。我应该补充一点,UUID实际上附带了开箱即用的连字符,我在代码中去掉了它们,因为我认为没有连字符的键看起来更像键。只要从我的代码片段中拉出
.replace(“-”,”)
,就可以从UUID生成连字符键。如果您想缩短UUID生成的密钥,请添加一个
.substring()
。请注意截断UUID-它们(有些)是结构化的,并且截断版本的唯一信息可能比您预期的少。很好!(虽然如果他的beta版有这么多的注册,以至于UUID子字符串发生冲突,这将是他面临的最小问题:P)最简单的方法通常是最好的,而且由于您可以控制生成和验证,这种方法会很好地工作。我应该补充一点,UUID实际上附带了开箱即用的连字符,我在代码中去掉了它们,因为我认为没有连字符的键看起来更像键。只要从我的代码片段中拉出
.replace(“-”,”)
,就可以从UUID生成连字符键。如果您想缩短UUID生成的密钥,请添加一个
.substring()
。请注意截断UUID-它们(有些)是结构化的,并且截断版本的唯一信息可能比您预期的少。很好!(不过,如果他的beta版有这么多的注册,以至于UUID子串发生冲突,那将是最少的