簡體   English   中英

PHP MySQL-動態加密解密數據而不存儲密鑰

[英]PHP MySQL - on the fly encrypt decrypt data without storing the key

我已經經歷了幾個有關此的SO問題,而我的方法在想要加密數據方面有所不同。 這是我想做的..

基本上我所有的客戶數據都存儲在數據庫中,三周或四周后,我不再需要他們的數據,例如地址,城市,州,郵政編碼,電話,電子郵件地址,訂購的產品等。

現在,這些數據以原始格式存儲在數據庫(mysql)中。

我的想法是,幾天后,我將加密mysql數據庫中的所有數據,並且不存儲密鑰,而是每次都通過輸入框手動輸入(如果要加密,或者出於某種原因)解密它只是為了在屏幕上顯示)。

所以基本上這就是它的工作方式。

1)在mysql中選擇客戶的記錄

2)通過輸入框獲取加密密鑰

3)通過加密數據更新mysql記錄

這是我的兩個問題...

1)從某種意義上說,如果數據庫受到破壞,則數據將得到保護,上述方法是否是一個好的策略? 另外,如果入侵者要獲取代碼,則他們將無法訪問密鑰,因為密鑰不會存儲在任何php文件中的任何位置。

2)我應該如何設置加密系統? 我應該使用mysql的函數AES_ENCRYPT (請記住,數據的長度可能會有所不同,例如地址,電子郵件地址或有關客戶的其他信息)

與AES相比,對您而言, 公鑰加密可能是一個更好的選擇。 它使用兩個鍵代替一個。 使用公鑰加密的數據只能由私鑰解密。 這意味着您不必擔心公鑰落入不正確的人手中,因為使用它實際上無法解密任何數據。

PHP公開密鑰加密的最佳選擇是標准OpenSSL擴展 ,它使用行業標准RSA系統。

密鑰可以存儲在需要密碼解密的PEM編碼 (fancy base64)文件中。 您想要提示用戶輸入的是此密碼短語,而不是實際的密鑰。 這很幸運,因為安全的RSA密鑰相當大並且無法完全記住。 這也使您可以將私鑰安全地存儲在服務器上。

同樣,這應該很明顯,但是即使這是一個完全內部的應用程序,您也可能要確保通過SSL為您的應用程序提供服務。 在不保證數據傳輸安全的情況下保護數據是愚蠢的。

聽起來這個方案聽起來不錯。 您只需要注意一些細節。

AES_ENCRYPT (很好-這也適用於您可能使用的任何其他加密方法)返回二進制字符串。 您需要將其存儲在可以容納二進制字符串( BINARYVARBINARYBLOB變體)的列中,而您可能會將預加密信息存儲在非二進制字符串列中。 因此,您可能需要為加密信息設置另一組列,或者使用一些基於文本的編碼來將加密數據放入與未加密形式相同的列中。

另外,您應該在應用程序邏輯中非常小心,以免意外地用未加密的數據填充加密的行(請考慮以下情形:查看記錄->解密->保存更改)。

最后,如果壞人對您的服務器/應用程序具有寫訪問權,那么他們很可能會攔截並保存加密密鑰。 由於所有密鑰的密鑰可能是相同的(由於密鑰管理的考慮),這足以使他們獲取所有數據。 但是,如果他們僅管理讀取訪問權限,那就太好了。

您還應該考慮在發生攻擊時如何更改密碼。 @Charles的想法可以解決這個問題,但是使用RSA加密實際數據可能會很慢(公鑰算法比對稱密碼要慢得多)。

我建議您在查爾斯的建議和您的原始想法之間做一些事情。 存儲單個加密密鑰,但請確保使用密碼對密鑰進行加密。 用單個密鑰加密您的數據。 當用戶想要解密數據時,他們可以輸入密碼短語,從而可以訪問密鑰。

現在,您可以隨時更改密碼,而無需更改加密密鑰,也無需重新加密所有數據。

AES是實際加密工作的不錯選擇。 它的速度很快,並且已經過深入研究。

我不確定這是否對您有用,但是上個月在RSA上有一家公司為Linux上的mySQL提供了透明數據加密。 它們還具有一種管理和存儲密鑰的方法,以使它們與數據分開。 適用於PCI,HIPAA-HITECH等

它們在mySQL寫入時加密到磁盤,並在請求數據時解密。 完全無需更改應用程序或數據結構。 公司是Gazzang。 只需搜索它們,或查看RSA Innovation Sandbox 2011。

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM