2010-12-20 27 views
8

我正在尋找使用PHP和MySQL存儲一些相當敏感的數據,並將使用某種形式的可逆加密來做到這一點,因爲我需要以純文本的形式返回數據以供任何使用。兩鍵加密/解密?

我會從用戶的用戶名/密碼組合中派生出加密密鑰,但我很遺憾要在忘記密碼的(不可避免的)事件中做什麼。我意識到,加密的目的是,它只能撤消使用正確的密鑰,但這一定已被解決之前..

我試圖讓我的頭周圍是否公鑰加密將適用於問題,但我所能想到的是,私鑰仍然需要正確解密數據。

任何想法?

回答

3

我正在尋找存儲將使用某種形式的可逆加密 這樣做,使用PHP和MySQL和 一些相當 敏感的數據,因爲我需要 獲取數據以純文本 背出它是有用的。

保護敏感數據是很好的。現在:

  • 是誰的數據? (您的,您的用戶或第三方?)
  • 它需要保護什麼? (披露,貪污腐敗(意外或故意的......)
  • 誰它需要被保護,
    • 健側各方不言而喻。
    • 你需要/想避免訪問自己的明文數據(有用對推諉)
    • 你需要保護可見給第三方或者您的用戶的數據,
    • 還是從用戶的第三方數據,
    • 還是從用戶或第三方數據?
  • 什麼是可能的攻擊?
    • 在服務器完全受損的情況下,您需要保護嗎?
    • 您是否需要防止應用程序級別的攻擊,其中用戶只需訪問某些但不是全部可用數據(例如訪問SQL數據庫,但不訪問文件系統)?
    • 數據量是否足夠小以至於攻擊者可以猜測並簡單地檢查他/她是否正確? (短密碼,數字,簡單的文字,固定形式的文本可能是候選人)
    • 攻擊者是否知道明文是要攻擊的?
  • 如果用戶忘記自己的密碼,或者是否值得提高暴露數據風險以避免成本,那麼數據是否會消失(或重新檢索數據)會更好?

可能還有其他問題,但這是您在使用加密時想要考慮的事情的類型。答案將幫助你找出你需要什麼與你想要什麼,並可能有助於指向正確的方向。您可能不想與我們分享所有答案。

我將獲得來自用戶的用戶名/密碼,加密密鑰 組合,但我難倒什麼 在一個 密碼(必然)事件做被遺忘。我知道那 加密的目的是 它只能使用 正確的密鑰被撤銷,但這一定是 之前解決..

你可能已經在一個解決方案決定不考慮影響。這並不意味着解決方案是錯誤的,但是這個問題表明你應該考慮你願意爲安全而冒的風險。有時數據會冒風險。

我試圖讓我的頭周圍 公鑰加密 是否會應用到這個問題,但我所 能想到的是,私鑰 仍然需要的是正確 解密數據..

這聽起來像一個解決方案,在尋找一個問題。當您有兩個(或更多)獨立參與者對他們之間的數據通信感興趣時,公鑰密碼學非常有用。這些角色可以是真實的(人)或功能性的(系統的組成部分),但沒有兩個角色,就沒有理由擁有單獨的公鑰和私鑰。

1

爲什麼你爲每個用戶使用不同的密鑰?

如果您選擇一個密鑰,則處理起來要容易得多。

將加密密鑰存儲在數據庫外部。

您的應用程序仍然必須有權訪問它,但具有db轉儲的人將無法讀取加密信息。

+2

如果有人以數據庫轉儲結束,我會假定他們也能夠獲得我的應用程序源代碼 – Matthew 2010-12-20 22:15:02

5

目前還不清楚你在努力的是什麼,所以關於如何實施它的建議很難。

像PGP和S/MIME這樣的標準使用新的對稱密鑰來加密每個消息。這些密鑰隨後會爲消息的每個收件人加密。通過這種方式,不是複製每個收件人的郵件(可能很大),每個人都獲得相同的密文,並且只有密鑰(很小)會被複制,但每個收件人的加密方式不同。

也許你可以在這裏做類似的事情,使用用戶密碼加密密鑰,並用公鑰加密另一個副本。如果用戶忘記密碼,則可以使用您的私鑰爲他們恢復消息(在適當的備份身份驗證之後)。

4

傳統的解決方案是使用「恢復代理」:一個用戶持有第二個密碼,可用於解密所有數據。嚴格的使用政策將適用於使用恢復密碼,例如將其置於安全的狀態。

然後,要麼加密所有數據兩次:一次使用用戶密鑰,一次使用恢復密鑰;或者,爲每組數據生成一個會話密鑰,並且只對數據加密一次,但會話密鑰兩次。

爲了達到這個目的,至少恢復代理的密鑰必須是不對稱的,因爲私有部分將存放在安全區中,並且存在於軟件中的公鑰。

作爲使用相同方案的另一種備選方案:在密碼更改時使用恢復密鑰加密用戶的密碼。這很容易實現,但可以恢復密碼,而不僅僅是數據,這可能是不可取的。

+0

如果您想了解如何實現這一點的詳細信息,請查閱EFS適用於Windows。它可以像給予不同的受託者能夠查看不同數量的數據一樣複雜 - 但這意味着管理更多的密鑰 - 或者像使用不同的公鑰加密兩次相同的密鑰一樣簡單。 – SilverbackNet 2010-12-24 01:46:45

2

基本上,如果你加密了一些東西,並且丟失了加密密鑰,那你就搞砸了。

當涉及到保護數據,您需要考慮爲什麼你試圖保護它反對什麼你保護它,。爲了做到這一點,值得做出什麼樣的折衷 - 唯一真正安全的系統是與互聯網完全隔離的系統,這是一種安全水平,對大多數應用來說都是自欺欺人的。

因此,這裏有一些問題要問自己:

  1. 如果有人妥協我的數據庫,是可以接受的他們能夠訪問這些數據?
  2. 如果有人妥協我的整個應用程序堆棧會怎麼樣?

如果上述兩個問題的答案都是「否」,那麼密鑰資料必須由用戶持有。如果他們失去了密鑰,他們將失去對他們數據的訪問。

您可以手動鍵恢復提供一個選項,如果你也有一個「萬能鑰匙」,你不隨地存儲近應用程序,只有你持有它,你用它來手動重置密碼。如果這也不是一個選項(比如說,只有用戶應該能夠訪問數據,而不是系統管理員),那麼你將不得不在某個地方做出妥協。

1
  1. 生成隨機會話密鑰。
  2. 使用會話密鑰來加密數據。
  3. 使用您需要的任意數量的用戶密碼加密隨機密鑰。

這樣,您可以使用任何用戶密碼來解密數據。

2

這是我曾經想過自己一個問題,我看到它下面的選項可供選擇(與選項#1是最安全的):

  1. 提供任何重置密碼功能 - 如果他們有忘記密碼,然後鎖定。

  2. 生成新的安全主密鑰並加密&用此主密鑰對用戶的密鑰進行哈希處理,並將密文和哈希結果存儲在數據庫中。然後通過將用戶下載的文件添加到用戶的電子郵件中,或者在屏幕上顯示安全主密鑰,使用戶知道安全密鑰。要重置密碼,用戶必須輸入這個主密鑰,然後進行散列和比較,如果它們匹配,則解密數據庫中的用戶密鑰。

  3. 要求用戶在註冊時提供2個安全問題和答案;散列答案並存儲問題並在數據庫中回答散列。第二個答案用作加密用戶密鑰的主密鑰。要接收密碼重置請求電子郵件,用戶必須正確回答第一個問題。一旦他們點擊電子郵件中的鏈接,網頁就會提出第二個問題,如果這是正確的並且查詢字符串參數值有效,那麼使用第二個問題的答案來解密用戶的密鑰。

  4. 使用應用程序全局主密鑰(可能存儲在Web/UI應用程序中,並使用它來加密和存儲用戶密鑰。一旦用戶通過密碼重置電子郵件進程驗證,用戶的密鑰將使用應用程序解密。全球主密鑰,然後重新加密用新密碼

總之,每一個選項的好處如下:

  1. 這是最終的安全性和將可能是唯一的選擇如果da ta對保持加密至關重要。然而,在現實世界中,人們忘記自己的密碼就像太陽升起一樣,而不提供重置密碼功能可能是一個糟糕的商業決定。

  2. 這是安全的,因爲主密鑰沒有存儲在前端或數據庫中,所以如果平臺受到損害,那麼數據將需要一些重要的解密努力。不過,缺點是用戶仍然可能會失去主密鑰。

  3. 這裏的弱點是如果數據庫被攻破,問題的答案可能被研究,然後用於解密用戶的加密密鑰。

  4. 如果您的平臺遭到黑客入侵,此方法會將應用程序密鑰留在堆棧中,從而使數據容易受到攻擊。唯一的保護是如果數據庫服務器被黑客攻擊,那麼數據仍然是安全的。

與軟件開發世界中的大多數事情一樣,您需要考慮什麼是最適合您嘗試完成的目標,併爲正確的平衡而努力。