web-dev-qa-db-fra.com

Est "Pourquoi devriez-vous éviter AES dans MySQL?" vrai?

De n article de Smashing Magazine 2012 une déclaration assez audacieuse est faite pour éviter AES dans MySQL lui-même. Ou comme ils l'ont dit "Pourquoi devriez-vous éviter AES dans MySQL?". Cependant, si vous recherchez le chiffrement SQL, vous trouverez souvent le AES_ENCRYPT de (My) SQL mentionné. Je ne dis pas que de nombreux résultats de recherche signifient que la déclaration est fausse, mais cela m'a juste fait réfléchir: les trois raisons citées ci-dessous sont-elles réellement vraies?

Que pensent les experts en sécurité ici des raisons "pourquoi PHP's Mcrypt est supérieur aux fonctions AES de MySQL":

  • MySQL a besoin d'un lien de base de données entre l'application et la base de données pour que le chiffrement et le déchiffrement se produisent. Cela pourrait entraîner des problèmes d'évolutivité inutiles et des erreurs fatales si la base de données présente des défaillances internes, rendant ainsi votre application inutilisable.

Je ne peux pas comprendre ce problème; si vous cryptez/décryptez en php, vous devez également stocker les valeurs dans la base de données avec un lien de base de données? Si le déchiffrement échoue du côté de php, cela conduit également à des échecs d'application? Quel est le point soulevé ici?

  • PHP peut effectuer le même décryptage et cryptage MySQL avec un certain effort mais sans connexion à la base de données, ce qui améliore la vitesse et l'efficacité de l'application.

Php peut le faire "avec un certain effort" et cela améliore la vitesse de l'application? Parce que vous cryptez avant de l'envoyer sur le câble, l'application (qui gère le cryptage) gagne en vitesse et en efficacité? Comment cela pourrait-il être vrai? À mon avis, il s'agit du "meilleur outil pour le travail", donc l'argument selon lequel "php est capable aussi" ne signifie pas en soi que c'est le meilleur également. C'est juste un outil , sans argument pourquoi c'est le meilleur outil.

  • MySQL enregistre souvent les transactions, donc si le serveur de la base de données a été compromis, le fichier journal produirait à la fois la clé de chiffrement et la valeur d'origine.

Il s'agit d'un point valide si vous chiffrez des valeurs dans la base de données et que la journalisation est activée. Au moins, vous devez désactiver le journal des requêtes générales car le journal binaire n'enregistre que les transactions mais pas les instructions select. Si vous n'avez pas du tout besoin de vous connecter, vous pouvez simplement faire la déclaration "si vous utilisez AES dans MySQL, désactivez toutes les connexions". Cela me semble plus valable que "si vous voulez utiliser AES dans MySQL, faites-le en php".

Quelqu'un peut-il m'expliquer pourquoi les points ci-dessus peuvent être valides et pourquoi - en général - il est préférable de crypter vos données dans votre application (php) plutôt que dans (My) SQL.

23
Jurian Sluiman

La principale raison de ne pas utiliser les fonctions AES_ * dans MySQL est qu'elles utilisent le mode de fonctionnement bloc ECB, qui n'est pas sécurisé.

Lire la suite sur:

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

Edit: Depuis MySQL 5.6.17, les choses ont changé et MySQL prend en charge le mode bloc CBC, mais il doit être activé manuellement. Lire http://mysqlserverteam.com/understand-and-satisfy-your-aes-encryption-needs-with-5-6-17/

17
Matrix

Sur toutes les choses, je suggère de laisser MySQL faire le cryptage AES n'est pas un gros problème. Cela vous fera probablement perdre (en moyenne) beaucoup plus de temps à récupérer/écrire les données qu'à les chiffrer. C'est à moins que votre base de données ne soit jamais en train de chiffrer et de déchiffrer.

Néanmoins, il y a un gros problème à laisser MySQL faire l'AES: vous avez besoin de votre application PHP pour émettre une requête contre MySQL où la clé de cryptage est transmise en clair. Pour protéger cela, vous devrez utiliser une connexion sécurisée, ou bien une commande tcpdump est facilement capable d'écouter votre discussion PHP-MySQL.

Si votre application PHP crypte les données en interne, eh bien c'est une exposition de moins de vos données et un composant de moins traitant des données non cryptées ou des clés visibles.

5
Shlomi Noach

(Je ne suis pas d'accord qu'il s'agit d'un doublon de Est-il préférable d'effectuer le chiffrement à l'aide de fonctions de base de données ou de code? bien qu'il y ait beaucoup de chevauchements)

La seule justification à laquelle je peux penser - et c'est une justification importante et valide - est qu'il est facile de faire évoluer le niveau d'application (PHP) mais difficile de mettre à l'échelle un niveau de base de données relationnelle (MySQL). Pour le premier, vous ajoutez simplement plus de serveur - mais le second a besoin de plus grandes boîtes/clustering coordonné. Par conséquent, le chiffrement en PHP réduit la charge sur le SGBD.

De plus, concernant "MySQL a besoin d'un lien de base de données ...", l'envoi des données ailleurs pour le traitement introduit une latence. Le calcul de la valeur chiffrée ou déchiffrée de certaines données peut être un travail difficile - mais il est peu probable que cela prenne presque autant de temps que l'envoi de données sur un réseau.

Mais la question primordiale est de savoir comment cela s'intègre dans le modèle de sécurité - et c'est là que la question des journaux et de la gestion des clés entre en jeu.

4
symcbean

Selon la documentation de MySQL sur les fonctions de chiffrement, http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html

Mise en garde

Les mots de passe ou autres valeurs sensibles fournis comme arguments aux fonctions de chiffrement sont envoyés en texte brut au serveur MySQL sauf si une connexion SSL est utilisée. De plus, ces valeurs apparaîtront dans tous les journaux MySQL dans lesquels elles sont écrites. Pour éviter ces types d'exposition, les applications peuvent crypter les valeurs sensibles côté client avant de les envoyer au serveur. Les mêmes considérations s'appliquent aux clés de chiffrement. Pour éviter de les exposer, les applications peuvent utiliser des procédures stockées pour crypter et décrypter les valeurs côté serveur.

Pour éviter cela, ils suggèrent de chiffrer du côté client.

4
Karthick