2011-05-18 85 views
4

我在寫一個web和Android應用程序,允許用戶存儲和訪問一些潛在的私人數據。通過RPC傳輸此數據已通過SSL進行保護。我目前將這部分數據存儲在Text屬性中,沒有任何加密。我現在正在研究如何更好地保護數據的存儲。在App Engine上加密用戶數據

問題1:是否有任何通用的最佳實踐或技巧來加密App Engine上的存儲數據?

我的一個想法是將該屬性切換到Blob字段,通過網絡傳輸加密數據,並在客戶端(使用Javascript和Android)進行解密和加密。

對於加密密鑰,我正在使用UserService提供的登錄用戶的電子郵件地址。用戶電子郵件地址僅在用戶登錄時才知道,並且敏感實體沒有提及用戶的電子郵件地址—只有用戶ID。

問題2:用戶的電子郵件地址是否有意義作爲加密密鑰?如果不是,還有什麼其他衆所周知的加密密鑰選項?

+0

我剛剛意識到至少有一個電子郵件地址作爲加密密鑰的缺陷:他們可以改變,如果用戶更改她的帳戶電子郵件地址。問題2上的 – 2011-05-18 06:26:50

+1

:您不想使用電子郵件地址或任何其他衆所周知的或易於猜測的數據作爲加密密鑰。 – 2011-05-18 19:57:42

+0

選中此https://cloud.google.com/security/encryption-at-rest/。如果您對Google提供的內容不滿意,可以添加自己的應用程序層加密。 – 2016-12-10 15:10:28

回答

8

我不確定你從中得到了很多好處。通過SSL傳輸數據當然是一個好主意。如果您未加密存儲用戶數據,則在他們劫持任何內容之前,仍有人需要訪問數據存儲區。如果您基於用戶對象的屬性對數據進行加密,則必須在客戶端加密/解密代碼中公開該關係,因此基本上是公開的。有人獲得訪問您的數據存儲和您的App Engine源碼仍然可以解密所有內容,這只是更棘手。

一種替代方法是存儲加密密鑰服務器端,但採取一些額外的步驟來保護它。 Permanently prohibit code downloads。將您的加密密鑰保存在源代碼中,而不是數據存儲區中,而不是源代碼管理中。將其粘貼在USB密鑰上,然後編寫一個自定義部署包裝,在最後一分鐘將密鑰注入代碼中,部署並清理代碼。這樣,獲得應用程序管理權限並訪問源代碼管理權限的用戶仍然無法解密用戶數據。您的部署機器仍然很脆弱,但您已經減少了攻擊空間。

如果您想更進一步,請讓用戶生成自己的加密密鑰,並將它們存儲在客戶端。切勿將它們傳輸到服務器。攻擊者仍然可以攻擊一個用戶,但是包括你在內的任何用戶都無法解密用戶數據。如果用戶丟失了自己選擇的密鑰,他們的數據將永遠丟失。

+0

偉大的建議,謝謝!我肯定考慮添加一個基於PIN的'鎖定'功能,用戶可以輸入PIN作爲客戶端加密/解密密鑰。 – 2011-05-18 15:28:14

0

將屬性更改爲Blob確實是一個好主意,在這種情況下,加密和解密將變得很容易。使用一些默認庫來加密數據。談到下一點,將電子郵件用作加密密鑰實在是一個壞主意,您應該使用用戶對象中提供的User_id,這非常獨特。