2008-10-26 39 views
11

說一個表中的每一行都有關於一個特定用戶的數據。用戶有一個密碼來訪問系統。MySQL加密列

如何使用InnoDB對一列數據進行加密,以便除數據用戶之外沒有人可以讀取數據?我正在考慮像使用基於從用戶密碼計算出的散列值的密鑰來使用MySQL加密函數之一(如AES)。

任何一個是否有任何指向我怎麼能做到這一點?我在正確的軌道上嗎?

一個低於

修改用戶密碼的問題的答案涉及的新密碼是不是重新加密一大堆用戶的數據更直截了當的方式重新加密的用戶密鑰可以是任意大的。用戶密鑰在系統中的用戶數據的整個生命週期內保持不變。

這有什麼用?說密碼是pass1。並且有一堆記錄使用由此生成的密鑰加密。如果用戶現在將密碼重置爲pass2,我無法解密使用pass1加密的數據。在用戶完全忘記密碼的情況下,他所有的加密數據都將丟失。

+0

我並不涉及您的具體情況,但是我發現這篇文章對所涉及問題的更全面介紹很有幫助:http://i.amniels.com/mysql-database-encryption-using-public-private-keys – 2012-12-02 18:53:27

回答

8

我不知道用用戶的密碼散列加密數據是否有很多意義,尤其是,如果你將散列本身保留在數據庫中。在這種情況下,任何可以訪問加密數據的人都可以訪問密碼哈希並解密數據。

另一種方法是使用特定於用戶特定數據的特定應用程序密鑰來加密數據。但是,那麼您將遇到另一個問題:如何安全地存儲應用程序密鑰。對於這個問題,我不知道一個簡單的答案,但如果您擔心數據庫數據可能受到損害,而不是原始代碼本身,則將它保留在源代碼中可能足夠好,例如,如果您的數據庫存儲在異地(請考慮Amazon S3)。

使用用戶密碼提供應用密鑰有助於在數據庫中只保留密碼散列,但可能引入另一個安全漏洞:您必須在應用程序會話中以明文保留用戶密碼。

至於技術方案,很簡單,sample code is available

INSERT INTO secure_table VALUES (
    1, 
    AES_ENCRYPT(
    'plain text data', 
    CONCAT(@application_password, @user_password)) 
); 

在任何情況下,你將不得不存儲應用程序密碼的地方,所以我不認爲有一個簡單的方法:可以按如下步驟將數據與密碼哈希加鹽的應用程序密碼加密修改提供完美的安全性。

我能想到的另一種方法是要求用戶輸入一個短密碼,您可以將其用作加密密鑰。 PIN不會存儲在數據庫中,但是您每次訪問數據時都需要詢問用戶。當然,你必須要考慮的

而且是加密的可行性。如果沒有解密,您將無法進行索引或搜索。它可能需要一些有限的數據(例如信用卡號碼),但我不會很喜歡它。

0

我不認爲這是最好的辦法,除非你強制用戶不能更改密碼,或者您有辦法重新加密每個用戶改變他/她的密碼時的一切。

0

你可以存儲其他的密鑰來加密/解密創建一個新用戶時可能產生的用戶特定的數據。我們稱這個新的關鍵用戶密鑰。這個用戶密鑰也應該在數據庫中進行加密,最直接的方法是通過用戶的密碼或任何其他支持密碼的數據(例如密碼和創建/修改時間等)對其進行加密。

我會保持在用戶會話的解密用戶密鑰在會話中的任何需要的時候訪問用戶的數據。

修改用戶密碼的問題包括通過新密碼重新加密用戶密碼,該密碼比重新加密可以任意大的一大堆用戶數據更加直截了當。用戶密鑰在系統中的用戶數據的整個生命週期內保持不變。如果認證是通過發送實際的用戶密碼,以在登錄服務器進行

當然這種方法只能使用,因爲僅數據庫最好包含密碼的哈希。

0

說出密碼是PASS1。並且有一堆記錄使用由此生成的密鑰加密。如果現在用戶重置爲2步的密碼,我沒有解密使用PASS1加密數據的方式

的關鍵在於需要一個可逆式的方式進行加密,以便它可以使用PASS1解密 並使用pass2重新加密。

總結:

在數據庫中存儲的是:使用透明密碼單向加密的密碼(密碼檢查), 用於其他的數據的加密密鑰,可逆加密(或在任何情況下,以與存儲在數據庫中的方式不同的方式加密密碼)以及使用清除加密密鑰可逆加密的其他數據。

無論何時您需要其他數據,您都必須擁有清晰的(或不同於存儲在數據庫中的密碼)密碼,讀取加密密鑰,使用密碼對其解密,然後使用它解密其他數據。

當密碼改變時,加密密鑰是使用舊密碼解密,使用新的密碼進行加密,並存儲。

2

要澄清問題中提到的答案之一:「用戶/應用程序密鑰」是隨機生成的私人密鑰,用於加密數據。私鑰永遠不會改變(除非它被破壞)。您使用密碼加密並存儲私鑰。由於私鑰比數據小得多,所以更改密碼要便宜得多:只需用舊密碼解密私鑰並用新密碼重新加密即可。

0

如果您需要在沒有用戶交互的情況下訪問數據(例如,用於數據庫遷移),則不會有密鑰解密。

1

對於不是用戶特定(全局)的數據,也可以使用對稱密碼和非對稱密碼的組合。您可以有一個extra password字段,要求所有用戶輸入,以便即使一個用戶更改了密碼,全局數據仍然可用於其他密碼不同的用戶。

extra password可以與源代碼中的另一個salt-like string按位進行比較。它們一起可以形成對稱密鑰來解密存儲在數據庫中的private key(這永遠不會改變)。 private key使用extra password解密後,私鑰可以解密和db中的所有數據。私鑰可以存儲爲會話變量。

顧名思義,public key可以作爲純文本字符串駐留在數據庫中。當你需要對db的write時,使用公鑰來加密數據。

您可以定期爲用戶提供新的extra password並重新加密靜態private key,然後與salt-like string進行異或。

如果數據是用戶特定的數據並且不是針對其他用戶的,則可以使用用戶的密碼而不使用額外密碼字段來加密私鑰。管理員可以爲特定用戶提供另一個私鑰副本,可以使用他的密碼進行解密。