2014-05-03 104 views
2

在我的服務器上,我有用戶可以存儲和加密文件。加密的文件與密碼衍生的密碼...如果用戶忘記密碼怎麼辦

用戶密碼是SHA512散列,所以我不能將其解密/解密。 用戶的文件使用在我的數據庫中加密的隨機file_key進行加密,知道文件的file_key的唯一方法是使用用戶的密碼來解密file_key。我這樣做是因爲我不希望每次用戶更改密碼時都要重新加密所有文件,而只是使用用戶的新密碼重新加密file_key並將其重新存儲在數據庫中。

生成一個密鑰來加密用戶的數據;將其稱爲「內容 加密密鑰」。從用戶密碼中獲取密鑰;將此稱爲 「密鑰加密密鑰」。使用 「密鑰加密密鑰」加密「內容加密密鑰」。將加密的密鑰與salt以及用於密鑰推導的迭代次數一起存儲。

如果他們更改密碼,請使用舊密碼 解密內容加密密鑰,然後使用從新密碼導出的密鑰對其進行重新加密。您應該爲新密碼選擇一種新鹽,並確保將其與新的加密密鑰一起存儲。

我已經開始想到一個小問題,事實上,如果用戶忘記密碼並要求重置密碼,我將失去所有加密文件,因爲這對我來說是不可能的訪問加密文件,沒有原始密碼..

是否有任何的加密策略來處理用戶可能忘記了密碼,因此,我將能夠解密文件的可能性?

回答

1

它應該是相當明顯的,關鍵是從密碼派生,並在宇宙密碼的所有的知識消失了,關鍵的,因此任何數據,是不可恢復的。

所以,如果你想有一個「忘記密碼」之類的功能,你需要保存用戶密碼的一些知識。顯然,這樣做會降低用戶數據的安全性。首先,如果您(作爲運行此類服務的個人)保持對用戶密碼的瞭解,則可以保留對其所有私人數據的訪問權限。其次,您必須將這些密碼保存在某個地方,這意味着它們可能會被入侵。

如果經過仔細分析,你願意降低安全性有利於方便,你要十分小心。

您可能會考慮的一種情況是使用不對稱加密來維護用戶密碼的加密數據庫。您將生成一個強大的密鑰對,並將公鑰放到您的Web服務器上。每當用戶創建或更改密碼時,都會使用公鑰來加密該密碼。如果用戶需要恢復密碼,您的系統需要您的人爲干預。您需要將加密的密碼從存儲器中提取到安全的環境中,並使用私鑰對其解密。

理想情況下,您不會在Web服務器上保留加密密碼。相反,您可以在Web服務器上加密它們,並立即將它們寫入其他配置爲允許從Web服務器進行只寫訪問的強化服務器。

我想,如果你有這樣的設置,你可以刪除需要一個人來解密。這會進一步降低安全性,可能會或可能不會被接受。在這種情況下,您應該將私鑰保留在該加強型服務器上,並附帶一些代碼,用它來解密「丟失」的密碼,並在Web框中更改密碼。當然,這顯然不如將私鑰完全散佈在閃存驅動器中的安全或其他方面那樣安全。

+0

我認爲這是最好的主意,考慮保持良好的安全級別。謝謝你這個偉大的答案@timdev! – raphjutras

0

用另一個「admin」或「恢復」鍵加密內容加密密鑰。最好使用公鑰加密和後端,管理良好的私鑰來恢復內容密鑰和數據(RSA非對稱加密,例如使用OAEP填充機制)。

當然,用戶應該相信你很好地處理私鑰。但無論如何,用戶必須信任你。用戶通常無法驗證您正在部署的方法來加密/解密/存儲數據。