2010-07-08 75 views
4

我廣泛使用MySQL,但不支持沒有外部庫的數據庫級加密。哪些數據庫支持加密

哪些數據庫帶有內置的db級支持,如果您知道MySQL足以進行比較,則它的語法與MySQL有多接近。我顯然寧願不重新學習一切。

我也廣泛使用PDO來處理sql注入,所以理想的PDO友好的是首選。

+2

是否真的很重要,您需要數據庫級加密? MySQL有加密/解密功能,您可以使用它來實現列級加密:http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html – quantumSoup 2010-07-08 05:27:26

+0

這可能會解決我的問題,但是在這種情況下,該列是可搜索的嗎?我可以做這個僞代碼'從加密列= $ input'的表中選擇列嗎?如果您提供更多詳細信息,請隨時發表評論作爲答案 – cooper 2010-07-08 05:32:25

回答

2

絕對。

SELECT *, AES_DECRYPT(`field`, 'key') as `decrypted` FROM enc WHERE AES_DECRYPT(`field`, 'key')='$input' 

我不知道是否有一種方法,每場只調用一次AES_DECRYPT。

1

我知道的Oracle 11g數據庫的支持級別的加密,但我不會說這是最相似的MySQL的

1

我剛剛在研究同樣的問題,因爲我在使用SQL Server中的列和數據庫級加密後調查了mySQL。

因此,這回答了我的擔憂,即mySQL沒有開箱即用的db級別加密,但在上面給出的答案中可能值得一提,每次調用時都會導致表掃描。這是因爲每行都必須被讀取,因此數據在被比較之前可以被解密。這使任何可能已經放在列上的索引失效(如果還有任何值的話)。但是下面的語句會做同樣的事情,但只調用一次ENCRYPT,並可能繞過任何表掃描。注意:mySQL語法在地方可能不正確。

DECLARE $EncryptedValue ... 
SELECT $EncryptedValue = AES_ENCRYPT(`$input`, 'key') 

SELECT 
    *, 
    $input as `decrypted` 
FROM enc 
WHERE 
    `field`=$EncryptedValue 
0

添加更多的回答者,如果有人有興趣:

排序的AES加密領域,

ORDER BY LOWER(CONVERT(AES_DECRYPT(field, 'key') USING latin1)) 

搜索的AES加密領域內,

SELECT *, AES_DECRYPT(`field`, 'key') as `decrypted` FROM enc WHERE 
LOWER(CONVERT(AES_DECRYPT(`field`, 'key') USING latin1)) LIKE '$input' LOWER('%" . $keyword . "%')) 

這樣做是因爲AESE_DECRYPT函數返回一個二進制字符串,不能使用LOWER