我正在尋找使用PHP和MySQL存儲一些相當敏感的數據,並將使用某種形式的可逆加密來做到這一點,因爲我需要以純文本的形式返回數據以供任何使用。兩鍵加密/解密?
我會從用戶的用戶名/密碼組合中派生出加密密鑰,但我很遺憾要在忘記密碼的(不可避免的)事件中做什麼。我意識到,加密的目的是,它只能撤消使用正確的密鑰,但這一定已被解決之前..
我試圖讓我的頭周圍是否公鑰加密將適用於問題,但我所能想到的是,私鑰仍然需要正確解密數據。
任何想法?
我正在尋找使用PHP和MySQL存儲一些相當敏感的數據,並將使用某種形式的可逆加密來做到這一點,因爲我需要以純文本的形式返回數據以供任何使用。兩鍵加密/解密?
我會從用戶的用戶名/密碼組合中派生出加密密鑰,但我很遺憾要在忘記密碼的(不可避免的)事件中做什麼。我意識到,加密的目的是,它只能撤消使用正確的密鑰,但這一定已被解決之前..
我試圖讓我的頭周圍是否公鑰加密將適用於問題,但我所能想到的是,私鑰仍然需要正確解密數據。
任何想法?
我正在尋找存儲將使用某種形式的可逆加密 這樣做,使用PHP和MySQL和 一些相當 敏感的數據,因爲我需要 獲取數據以純文本 背出它是有用的。
保護敏感數據是很好的。現在:
可能還有其他問題,但這是您在使用加密時想要考慮的事情的類型。答案將幫助你找出你需要什麼與你想要什麼,並可能有助於指向正確的方向。您可能不想與我們分享所有答案。
我將獲得來自用戶的用戶名/密碼,加密密鑰 組合,但我難倒什麼 在一個 密碼(必然)事件做被遺忘。我知道那 加密的目的是 它只能使用 正確的密鑰被撤銷,但這一定是 之前解決..
你可能已經在一個解決方案決定不考慮影響。這並不意味着解決方案是錯誤的,但是這個問題表明你應該考慮你願意爲安全而冒的風險。有時數據會冒風險。
我試圖讓我的頭周圍 公鑰加密 是否會應用到這個問題,但我所 能想到的是,私鑰 仍然需要的是正確 解密數據..
這聽起來像一個解決方案,在尋找一個問題。當您有兩個(或更多)獨立參與者對他們之間的數據通信感興趣時,公鑰密碼學非常有用。這些角色可以是真實的(人)或功能性的(系統的組成部分),但沒有兩個角色,就沒有理由擁有單獨的公鑰和私鑰。
爲什麼你爲每個用戶使用不同的密鑰?
如果您選擇一個密鑰,則處理起來要容易得多。
將加密密鑰存儲在數據庫外部。
您的應用程序仍然必須有權訪問它,但具有db轉儲的人將無法讀取加密信息。
目前還不清楚你在努力的是什麼,所以關於如何實施它的建議很難。
像PGP和S/MIME這樣的標準使用新的對稱密鑰來加密每個消息。這些密鑰隨後會爲消息的每個收件人加密。通過這種方式,不是複製每個收件人的郵件(可能很大),每個人都獲得相同的密文,並且只有密鑰(很小)會被複制,但每個收件人的加密方式不同。
也許你可以在這裏做類似的事情,使用用戶密碼加密密鑰,並用公鑰加密另一個副本。如果用戶忘記密碼,則可以使用您的私鑰爲他們恢復消息(在適當的備份身份驗證之後)。
傳統的解決方案是使用「恢復代理」:一個用戶持有第二個密碼,可用於解密所有數據。嚴格的使用政策將適用於使用恢復密碼,例如將其置於安全的狀態。
然後,要麼加密所有數據兩次:一次使用用戶密鑰,一次使用恢復密鑰;或者,爲每組數據生成一個會話密鑰,並且只對數據加密一次,但會話密鑰兩次。
爲了達到這個目的,至少恢復代理的密鑰必須是不對稱的,因爲私有部分將存放在安全區中,並且存在於軟件中的公鑰。
作爲使用相同方案的另一種備選方案:在密碼更改時使用恢復密鑰加密用戶的密碼。這很容易實現,但可以恢復密碼,而不僅僅是數據,這可能是不可取的。
如果您想了解如何實現這一點的詳細信息,請查閱EFS適用於Windows。它可以像給予不同的受託者能夠查看不同數量的數據一樣複雜 - 但這意味着管理更多的密鑰 - 或者像使用不同的公鑰加密兩次相同的密鑰一樣簡單。 – SilverbackNet 2010-12-24 01:46:45
基本上,如果你加密了一些東西,並且丟失了加密密鑰,那你就搞砸了。
當涉及到保護數據,您需要考慮爲什麼你試圖保護它反對什麼你保護它,。爲了做到這一點,值得做出什麼樣的折衷 - 唯一真正安全的系統是與互聯網完全隔離的系統,這是一種安全水平,對大多數應用來說都是自欺欺人的。
因此,這裏有一些問題要問自己:
如果上述兩個問題的答案都是「否」,那麼密鑰資料必須由用戶持有。如果他們失去了密鑰,他們將失去對他們數據的訪問。
您可以手動鍵恢復提供一個選項,如果你也有一個「萬能鑰匙」,你不隨地存儲近您應用程序,只有你持有它,你用它來手動重置密碼。如果這也不是一個選項(比如說,只有用戶應該能夠訪問數據,而不是系統管理員),那麼你將不得不在某個地方做出妥協。
這樣,您可以使用任何用戶密碼來解密數據。
這是我曾經想過自己一個問題,我看到它下面的選項可供選擇(與選項#1是最安全的):
提供任何重置密碼功能 - 如果他們有忘記密碼,然後鎖定。
生成新的安全主密鑰並加密&用此主密鑰對用戶的密鑰進行哈希處理,並將密文和哈希結果存儲在數據庫中。然後通過將用戶下載的文件添加到用戶的電子郵件中,或者在屏幕上顯示安全主密鑰,使用戶知道安全密鑰。要重置密碼,用戶必須輸入這個主密鑰,然後進行散列和比較,如果它們匹配,則解密數據庫中的用戶密鑰。
要求用戶在註冊時提供2個安全問題和答案;散列答案並存儲問題並在數據庫中回答散列。第二個答案用作加密用戶密鑰的主密鑰。要接收密碼重置請求電子郵件,用戶必須正確回答第一個問題。一旦他們點擊電子郵件中的鏈接,網頁就會提出第二個問題,如果這是正確的並且查詢字符串參數值有效,那麼使用第二個問題的答案來解密用戶的密鑰。
使用應用程序全局主密鑰(可能存儲在Web/UI應用程序中,並使用它來加密和存儲用戶密鑰。一旦用戶通過密碼重置電子郵件進程驗證,用戶的密鑰將使用應用程序解密。全球主密鑰,然後重新加密用新密碼
總之,每一個選項的好處如下:
這是最終的安全性和將可能是唯一的選擇如果da ta對保持加密至關重要。然而,在現實世界中,人們忘記自己的密碼就像太陽升起一樣,而不提供重置密碼功能可能是一個糟糕的商業決定。
這是安全的,因爲主密鑰沒有存儲在前端或數據庫中,所以如果平臺受到損害,那麼數據將需要一些重要的解密努力。不過,缺點是用戶仍然可能會失去主密鑰。
這裏的弱點是如果數據庫被攻破,問題的答案可能被研究,然後用於解密用戶的加密密鑰。
如果您的平臺遭到黑客入侵,此方法會將應用程序密鑰留在堆棧中,從而使數據容易受到攻擊。唯一的保護是如果數據庫服務器被黑客攻擊,那麼數據仍然是安全的。
與軟件開發世界中的大多數事情一樣,您需要考慮什麼是最適合您嘗試完成的目標,併爲正確的平衡而努力。
如果有人以數據庫轉儲結束,我會假定他們也能夠獲得我的應用程序源代碼 – Matthew 2010-12-20 22:15:02