2014-05-21 39 views
1

我用AES_DECRYPT將敏感數據存儲在mysql表中。現在桌子大約是50 Mb。如何在AES_DECRYPT的大表中搜索?

我有一個web界面(用php),訪問者可以在其中搜索數據。我進行了LIKE搜索:

SELECT AES_DECRYPT(content,'salt') FROM table 
WHERE CONVERT(AES_DECRYPT(content,'salt') USING utf8) LIKE '%search%' 

它工作正常,但它變得非常慢。你有什麼想法如何結合良好的安全性和良好的搜索功能?

+1

您認爲您通過以這種方式使用加密功能來實現哪些安全性優勢? RDBMS和應用程序在傳輸時可以訪問密鑰和明文,所以唯一的好處是在磁盤上休息。即使如此,如果該磁盤也包含應用程序代碼,那麼它將保存解密密鑰(即使不是,例如在SQL日誌中也可能會這樣做):因此,您可能只通過默認方式實現了[安全性](http:// en.wikipedia.org/wiki/Security_through_obscurity) - 毫無意義。當然這很慢:索引不能使用,所以MySQL必須執行全表掃描。 – eggyal

回答

1

MySQL無法高效地搜索包含在函數中的列。不能在MySQL的函數評估中創建索引,就像使用PostgreSQL一樣。

由於所需的密鑰來解密內容必須提供給MySQL的這種類型的查詢,我不明白了一個道理,爲什麼數據庫服務器應該加密的內容。從安全角度來看,AES加密在這個階段是無用的。關鍵在於過程的記憶,因此數據在理論上不再安全。 (如果攻擊者可以接管進程的內存,他有密鑰和數據=>不安全)。

如果一個遵循這一觀點,這是沒有意義的使用MySQL的AES功能以這種方式。不過,如果你想繼續這種方式,你必須將未加密的數據保存到某個地方,以便MySQL能夠索引它。

爲了保護外部人員的數據,可能會加密MySQL的存儲。這可以(或多或少)通過設置加密卷並將MySQL的數據目錄移動到此位置輕鬆實現。 (例如,請參閱Ubuntu Tutorial for encrypted filesystems。)出於性能原因,應僅移動包含敏感信息的文件。

這是一個更簡單的解決方案,但承擔一些性能和管理風險。在serverfault上有a question,你可能想要閱讀。