2011-10-07 19 views
8

我需要在每個用戶的基礎上加密我的web應用程序中的內容。如何加密我網站上的用戶內容,以至於我甚至無法訪問內容?

我,root用戶,不想訪問用戶的內容,句點。

如何才能讓用戶成爲唯一可以訪問其內容的用戶?也許我可以做到這一點,所以他們的登錄密碼散列作爲加密和解密密鑰(然後他們的密碼存儲在我的數據庫中的單向散列,並且加密/解密哈希在登錄時從其原始密碼生成並存儲在一個本地cookie)?但是,如果他們更改密碼呢?然後我必須更新所有可能需要大量處理能力的內容。

是否有一種加密方法可以提供此功能,而不必在密碼更改時重新加密其內容?可能是類似於Linux上的ecryptfs?研究ecryptfs是一個很好的開始?

是否只有用戶可以訪問我的服務器上的內容(甚至不是我)甚至可行?

+0

我不知道hushmail.com如何做到這一點。 – SQLMason

+0

以下是他們的加密白皮書:http://www.hushmail.com/public_documents/Hush%20Encryption%20Engine%20White%20Paper.pdf –

+0

從Hushmail的電子郵件回覆:我們的系統的設計方式是:用您的密碼可以將 加密的電子郵件在您的帳戶中解密。密碼本身是 存儲在一個加密哈希,所以即使我們的工作人員看不到它。這意味着如果您的郵件被加密,我們無法閱讀它,這意味着 。 –

回答

11

過程:

  1. 生成一個隨機的祕密的內容進行加密。
  2. 使用他們提供的密碼加密#1中的隨機密碼。
  3. 將他們的密碼存儲爲單向散列(帶鹽,也許是多散列)。

當密碼改變:

  1. 重新生成從步驟#2的值。
  2. 重新生成步驟3中的散列高速緩存。

一旦登錄:

  1. 哈希密碼和核對在步驟#3中生成哈希值。
  2. 如果密碼匹配 - 使用實際提供的密碼解密來自#2的隨機密碼。
  3. 使用來自#2的隨機祕密來解鎖在#1中加密的數據。

注:

  • 沒有人可以在不知道隨機祕密數據進行解碼(#1)。隨機密碼只能用用戶的實際密碼解鎖(#2)(缺少暴力)。用戶的實際密碼僅以單向散列形式(#3)已知,因此您可以確認它是相同的,但無法對其進行解碼並恢復#2。
  • 忘記了密碼的過程是不可能的(你可以重新#3,但在#2隨機密鑰,現在失去了作爲一切鎖在地窖內)。
  • 每次更改密碼時,您都不必在步驟1中重新加密所有內容,只需要從#2中獲取(簡單/快速)隨機密碼。
  • 如果您在任何可能導致數據泄露的地方緩存提供的密碼或步驟1中生成的隨機密碼或其解密內容。
+1

你生成了它,但只要你不存儲它 - 沒有。解決這個問題的唯一方法就是讓他們的密碼解碼來自#2的加密表單。或者通過蠻力;)你可以在這一步使用他們的密碼散列,但你*不能*使用你存儲的散列表單(否則是的 - 你可以解密它,而不知道他們的密碼) – Rudu

+0

對不起,我刪除了我的評論,因爲如果我更仔細地閱讀了你的帖子,我問了一個我可以回答的問題。我喜歡你的想法。 –

+0

難道不可能產生隨機的祕密客戶端嗎?通過這種方式,您確實不會看到祕密 –

-1

你明白你需要使用他們的密碼作爲關鍵。

我不會與ecryptfs猴子,因爲加密的文件系統不是最好的解決方案。您不希望用另一個用戶使用的相同密鑰來加密一個用戶的數據。

當您加密數據時,您應該生成一個隨機字符串以用作鹽。這可以防止某人使用預先生成的哈希列表來解密數據。它還會更改兩個可能使用相同密碼的人的散列。

當用戶更改密碼時,您必須重新加密數據並生成新的salt值。這是我期望作爲客戶的安全級別,他知道當我更改密碼時,我正在重新加密所有數據以防止有人試圖強制我的密鑰。

您可以將鹽值存儲在未加密的數據庫中。

+1

使用eCryptfs,每個用戶的數據都可以使用自己的密鑰進行加密。 –

相關問題