我广泛使用MySQL,但如果没有外部库,它不支持数据库级加密。
内置db-level支持的数据库是什么,如果你知道MySQL足以进行比较,它的语法与MySQL有多接近。我显然不想重新学习一切。
我还广泛使用PDO来处理sql注入,因此理想的PDO友好是首选。
答案 0 :(得分:2)
绝对
SELECT *, AES_DECRYPT(`field`, 'key') as `decrypted` FROM enc WHERE AES_DECRYPT(`field`, 'key')='$input'
我不确定每个字段是否只有一次调用AES_DECRYPT。
答案 1 :(得分:1)
我知道Oracle 11g支持数据库级加密,但我不会说它与MySQL最相似......
答案 2 :(得分:1)
我刚刚研究了同样的问题,因为我在SQL Server中使用了列和数据库级加密后正在调查mySQL。
所以这回答了我的担忧,即mySQL没有开箱即用的数据库级加密,但是在上面给出的答案中值得一提的是,每次调用它都会导致表扫描。这是因为必须读取每一行,以便在比较之前解密数据。这会使任何可能放在列上的索引失效(如果那里也有任何值!)但是下面的语句会做同样的事情,但只调用一次ENCRYPT并可能绕过任何表扫描。注意:mySQL语法在某些地方可能不正确。
DECLARE $EncryptedValue ...
SELECT $EncryptedValue = AES_ENCRYPT(`$input`, 'key')
SELECT
*,
$input as `decrypted`
FROM enc
WHERE
`field`=$EncryptedValue
答案 3 :(得分: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不能使用的二进制字符串