2015-10-20 51 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