2012-01-24 111 views
7

我有一個網站,用戶提交他們的個人數據,我正在考慮使用aes-256加密這些數據,並且他們的密碼被用作該加密的密鑰,然後我將加密的數據存儲在mysql數據庫中。 ..如何在加密後更改aes-256密鑰?

現在,如果用戶改變他的密碼我將如何改變加密數據

我應該收集數據庫中的所有數據,然後用舊的密鑰,然後用重新加密解密它的數據的關鍵新鑰匙?

回答

13

當用戶更改密碼時,不需要重新加密所有用戶的數據。

生成密鑰來加密用戶的數據;稱這爲「內容加密密鑰」。從用戶密碼中獲取密鑰;將其稱爲「密鑰加密密鑰」。使用「密鑰加密密鑰」加密「內容加密密鑰」。存儲加密的密鑰以及用於密鑰派生的迭代次數。

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

因爲內容加密密鑰是從一個巨大的空間中隨機選擇的,所以在加密時可以安全地使用ECB作爲密碼模式。

即使您使用salt,即使使用尚未破壞的算法,也不要簡單地對密碼進行哈希處理。您需要重複數千次哈希操作。在大多數平臺上都有這樣做的庫(正確)。使用密鑰派生算法(PBKDF2,來自PKCS#5)從密碼創建密鑰。

這個概念如下the draft for password-based S/MIME encryption.

+0

加密密鑰存儲在哪裏?在應用程序服務器上的內存中,還是在數據庫服務器上的物理存儲中? – dimiguel

+0

@dimgl存儲在一些可靠,持久的存儲中,並進行備份。絕對不在記憶中。除非你不在乎內容是否因停電而不可挽回地被破壞。 – erickson

0

這很愚蠢。

AES使用256位密鑰,因此當您說您將使用密碼作爲密鑰時,密鑰的長度幾乎與密鑰大小要求一樣長。

+0

我會散列他們的密碼給我的256字節,然後用它在加密 –

+0

好吧,那麼你的格式是什麼建立密鑰? –

3

首先,您通常不應將密碼用作AES密鑰。也許像密碼哈希(而不是MD5)+鹽(你會在這種情況下儲存鹽但不是哈希)。

你可以做的一件事是用隨機密鑰加密每個用戶的文件,然後使用散列+密碼加密該密鑰。如果用戶更改密碼,則只需重新加密密鑰。

2

一種可能性考慮解耦用於將數據從用於訪問該數據的密鑰加密密鑰。仔細完成,這允許用戶隨意更改密碼,而只更改數據庫中的一條記錄。另外,您可以安排對密鑰進行的更改,以便在您方便時加密其數據。

它是如何工作的?

  • 您使用隨機生成的密鑰來加密用於用戶U的數據d,K U,d
  • 您加密密鑰K U,d有獨立的密鑰K1 ü,K從隨機鹽產生,S1 û(你保持的記錄)和用戶的密碼P1 ù(你可能會或可能不會跟蹤)。加密的密鑰是E1 U
  • 您存儲S1 U和K1 U,K準備好當用戶想要訪問他們的數據時。
  • 當用戶U想訪問他們的數據,他們爲您提供他們的密碼,P1 ü,和你擡頭S1 ü和K1 ü,K從數據再生,並用它來解密E1 ü,讓您ķ U,d一次,與您解密他們的實際數據。
  • 你保證,你可以檢測時給出的密碼是正確的,所以你不要噴涌向前二元亂碼,如果用戶類型錯誤的密碼。

當用戶想要更改他們的密碼時,這種間接性的好處就來了。如果您不使用某種類似於此的技術,則必須獲取並驗證舊密碼和新密碼,使用舊密碼解密所有數據,然後使用新密碼對其進行重新加密。

隨着間接的水平,你仍然提示他們的舊密碼的用戶(P1 ü)和新密碼(P2 ü),並對其進行驗證,但你只有解密E1 ù和然後用新的密鑰K2 U,K重新加密它,從新鹽S2 U和新密碼P2 U生成。您根本不必觸摸加密的數據。

通過間接級別,系統S還可以保存數據密鑰K U,D的第二個加密副本,並使用系統密碼加密。如果有必要或希望更改用於加密數據的密鑰,則系統可以使用其密鑰的加密副本來執行此操作。它可以保持他們的關鍵,其中的關鍵是最後記錄在用戶的記錄,所以當用戶返回到的數據看,它可以安排來改變存儲的密鑰K2 U,d因爲在那個時候,它有他們的密碼(其餘時間,它不)。

這是Kevin Kenan在「Cryptography in the Database: The Last Line of Defense」中的一些想法的輕微變化。密鑰是KEK(密鑰加密密鑰)的例子。您還可以閱讀本書中的關鍵系列,這將有助於管理加密數據。