2015-10-20 50 views
0

这是一项任务。 我必须在Google应用程序引擎上创建一个Web应用程序,并应用rsa算法将数据存储在应用程序引擎数据存储区中。我的应用程序只存储由用户创建的小笔记。我已经完成了应用程序,并且还应用了RSA来加密消息(从Implementing RSA algorithm获得代码)。为此,我分割字符串并将每个字符转换为ascii,然后将它们存储在重复的ndb.IntegerProperty中,但我不明白应该如何处理私钥和公钥。我想知道我在哪里存储私钥,一旦笔记已经加密并且用户再次访问它们,我如何获得公钥和私钥?我是否应该将密钥存储在数据存储中?在谷歌应用引擎webapp上实现RSA

加密在服务器完成以加密用户保存的注释。笔记是分成字符的字符串,然后对它们的ASCII值进行加密。所有这些都是在用户点击“添加注释”后在服务器端完成的。

解密在服务器端完成,当用户登录时,他的用户ID用于获取他存储的注释,解密后得到原始ascii值,然后形成原始字符串。

当前只有一个在代码中生成的密钥对。 链接到应用程序:http://cloudassignment-1102.appspot.com

让我知道如果我需要添加源代码。

+0

我更新了我的答案。我觉得很难给你100%的答案,因为这实际上是一个无用练习的例子,所以你应该在哪里存储你的密钥的真实答案是'任何你想要的'。为了简单起见,我建议按照我的编辑中所述的答案使用数据存储区。 – konqi

回答

1

理想情况下,您将私钥存储在某个地方(非常)安全。由于GAE是您所选择的平台,你有两个选择:

  • 把钥匙的地方在你的项目中,它是由源代码的可读性,但不公开(在Java中,这通常是一个资源文件夹或WEB-INF,不确定Python的等价物是什么)
  • 使用云存储并将文件放在那里。这是一个开销,但如果你想改变心脏外科手术风格...
  • 由于一个键基本上只是一个字节数组,你可以将它们定义为一个常量字节数组。这显然是最不灵活的选择。

编辑:

我只想说,这是一个愚蠢的分配。如果您隐藏服务器上的所有加密,则使用非对称加密完全没有意义。由于您的数据在发送给用户之前始终进行解密,因此基本上与对称加密或根本不加密相同。

但在做愚蠢的事情和学习的精神,而在它:

我假设你的代码生成每个用户的密钥对。因此,不可能将密钥存储为代码中的常量(GAE文件系统是只读的)。相反,您可以使用任何您希望的数据库(无论是云数据存储还是云数据存储)。

既然你应该有一个用户数据库实体的某个地方,你可以把公钥放在那里与其余的用户信息。如果您需要,您可以通过云端点从数据库提供公钥。既然这不是秘密,你不必保护这个端点。

密钥可以放在同一个存储中(数据存储/云端SQL?)但我会分开它,所以你不能查询它,并意外发布。引用用户的附加表/实体应该足够了。

+0

好吧,我将私钥存储在我的代码中,公钥又怎么样? 我应该有另一个ndb.model映射与特定用户的私钥? – user3542154

+0

公钥真的无关紧要。它可以是公开的。但是请等等......每个用户是否有密钥对?如果是这种情况,那么整个加密/解密应该发生在客户端,你必须在客户端处理密钥的存储。这将使用户的数据安全,即使从你自己:-) – konqi

+0

但我在哪里公开存储它?我是否应该将它们保留在代码中? 是的,我意识到为每个用户保留一个密钥对会更安全,但是如何处理客户端密钥的存储?对于私钥,我想我可以将它们存储在云中sql – user3542154