2010-07-08 2 views
4

J'utilise MySQL de manière intensive, mais il ne prend pas en charge le cryptage au niveau base de données sans bibliothèque externe.Quelles bases de données prennent en charge le cryptage

Quelles bases de données sont livrées avec un support de niveau db intégré, et si vous connaissez suffisamment MySQL pour comparer, sa syntaxe est proche de MySQL. Je préférerais évidemment ne pas tout réapprendre. J'utilise également beaucoup de PDO pour gérer des injections de sql, donc idéalement PDO-friendly est préféré.

+2

Est-il vraiment important que vous ayez besoin du cryptage au niveau de la base de données? MySQL possède des fonctions de cryptage/décryptage que vous pouvez utiliser pour implémenter le cryptage au niveau de la colonne: http://dev.mysql.com/doc/refman/5.1/fr/encryption-functions.html – quantumSoup

+0

Cela peut résoudre mon problème, mais la colonne consultable dans ce cas? Serais-je capable de faire ce pseudo code 'sélectionner la colonne de la table où la colonne chiffrée = $ input'? N'hésitez pas à poster un commentaire comme réponse si vous fournissez plus de détails – cooper

Répondre

2

Absolument.

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

Je ne suis pas sûr s'il existe un moyen d'appeler seulement AES_DECRYPT une fois par champ.

1

Je sais 11g Oracle prend en charge le cryptage de niveau de base de données, mais je ne dirais pas qu'il est le plus similaire à MySQL ...

1

Je viens d'étudier le même problème que j'étudie mySQL après avoir utilisé à la fois le cryptage de niveau colonne et db dans SQL Server. Donc, cela a répondu à mes inquiétudes que mySQL n'a pas de cryptage de niveau de la boîte de DB, mais il peut être utile de mentionner dans la réponse donnée ci-dessus, il en résulterait un balayage de table chaque fois qu'il est appelé. C'est parce que chaque ligne devra être lue afin que les données puissent être déchiffrées avant d'être comparées. Cela invalide tout index qui aurait pu être placé sur la colonne (s'il y a une valeur dans cela aussi). Cependant, l'instruction suivante ferait la même chose mais n'appelle ENCRYPT qu'une seule fois et peut contourner n'importe quelle analyse de table. Note: La syntaxe mySQL est probablement incorrecte à certains endroits.

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

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

Ajout de plus au answerer si quelqu'un est intéressé:

Pour sorte un champ chiffré AES,

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

Pour recherche dans un champ chiffré AES,

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

Cela est dû au fait que la fonction AESE_DECRYPT renvoie une chaîne binaire qui ne peut pas être utilisée par LOWER.