9
votes

Comment chiffrer des courriels dans la base de données MySQL, mais peut toujours les interroger?

Je souhaite stocker les adresses électroniques des utilisateurs dans une base de données MySQL à l'aide de cryptage pour vous assurer qu'ils ne seront pas rendus publics si la base de données est compromise. Je crois que si je les crypte avec AES_ENCRYPT () Fonction Je ne peux pas créer d'index dans une table innodb car je dois utiliser un type de données blob DataType. Si la table devient très volumineuse, il faudra beaucoup de temps.

Quelle est la meilleure solution pour la sécurisation de l'adresse e-mail mais qu'il est toujours capable de les interroger rapidement et de les préserver comme des valeurs uniques dans la colonne?


0 commentaires

3 Réponses :


4
votes

Si vous haussez les adresses avec SHA-256 ou quelque chose de similaire, vous pouvez toujours indexer vos tables, vous pouvez toujours effectuer des recherches d'adresses rapides (lors de la recherche d'un exemple de l'utilisateur@example.com, vous obtiendrez simplement l'entrée et Sélectionnez Correspondance des hachages dans les tables).

ssh utilise un Très similaire truc de hachage. (Recherchez l'option -h dans ce manage pour plus de détails.)


5 commentaires

Je pense que si je fais cette méthode, je ne peux pas non chiffrer les adresses électroniques et les utiliser ultérieurement pour envoyer un courrier électronique aux utilisateurs si nécessaire.


@Bshack, toute technique que vous pouvez utiliser qui vous permettrait de récupérer les adresses électroniques hors de la base de données pourrait également être utilisée par un attaquant qui obtient le contenu de la base de données. Votre seule protection réelle à ce point serait une clé dure de votre demande, car @PCMANTinker l'a suggéré, mais une personne qui reçoit une transmission de la base de données peut fréquemment obtenir le programme binaire. (Pas toujours, mais s'appuyer sur une clé intégrée dans votre code est assez fragile. :)


Vous pouvez utiliser l'adresse e-mail pour la recherche rapide, et dans une colonne différente ou une table, avoir la valeur cryptée. Je le mettrais dans une table séparée, vous pouvez donc la mettre sur une partition différente si nécessaire.


Le hachage, comme @snarnold suggéré, constituerait une bonne solution si vous n'avez pas besoin d'un accès explicite aux courriels de votre base de données. J'ai utilisé des logiciels contenant des mots de passe et compare une valeur hachée de l'entrée de l'utilisateur avec celle de la base de données. Cela dépend vraiment de votre objectif avec la récupération de courriels cependant.


Vous pouvez également utiliser le courrier électronique crypté au lieu de l'e-mail de hachage (ordinaire) ...



12
votes

Lorsqu'un utilisateur enregistre sur votre site, utilisez AES_ENCRYPT () pour chiffrer l'e-mail.

SELECT AES_DECRYPT(email, 'aeskey') from users;


6 commentaires

Donc, fondamentalement, je ne peux pas créer un index unique la colonne Adresse e-mail si je veux utiliser le cryptage?


Je crois que vous ne devriez pas avoir de valeurs cryptées d'AES conflictuelles à moins que un autre utilisateur tente d'utiliser le même email lors de l'inscription. Vous pouvez vérifier que les courriels sont uniques en interrogeant votre base de données lorsqu'un utilisateur enregistre. Un lien utile sur le cryptage AES et MySQL: Thinkdiff.net/mysql/ EncrypyT-MySQL-Data-With-Aes-Techniciques


Je vais essayer d'utiliser un type de colonne de texte, j'applicite la fin de l'UTF-8, de sorte que cela devrait être correct. Si l'ensemble du serveur est compromis et non seulement la DB, le pirate informatique peut saisir la clé de cryptage et décrypter les adresses électroniques dans la DB.


@bshack, oui si la touche et le message sont interceptés, le jeu est terminé, vous pouvez également avoir DB Server et Application Server sur différentes cases pour une autre couche de sécurité.


Et vous devez ensuite stocker la clé de votre serveur de toute façon, ce qui, si votre système et votre application sont piratés sont piratés, seront ouverts au pirate informatique, peu importe.


@ Jm4, pas nécessairement. Si vous avez une architecture de serveur qui sépare l'application et la base de données, ce serait une approche plus sécurisée. En vérité, tout peut être fissuré compte tenu de la quantité correcte de ressources et de temps.



0
votes

aes_decrypt (email, 'SecretKey') et aes_encrypt (email, 'Secretkey') est une solution optimale,

Je ne suis pas sûr à 100% de la baisse unique après le cryptage, mais la théorie indiquée si un courriel est une annonce unique doit être unique


1 commentaires

Les données cryptées d'AES peuvent-elles être stockées dans un type de colonne pouvant avoir un index de colonne InnoDB?