Quelle est la meilleure méthode à utiliser / stocker les clés de chiffrement dans MySQL
J'ai l'intention sur l'utilisation de MySQL et il est intégré dans la fonctionnalité de chiffrement pour chiffrer /déchiffrer certaines colonnes dans certains tableaux. Le souci que j'ai est que j'ai besoin de stocker la clé quelque part. Je pourrais certainement stocker la clé dans un fichier et contrôler les autorisations de fichier et les autorisations de l'application qui accède à elle, mais est-ce suffisant? Je pourrais aussi créer un service web pour obtenir la clé ou quelque chose.
Je suis dans une petite boutique où je serais le seul (peut-être l'un de l'autre personne) qui aurait accès à la machine de l'application. Edit: je devrais ajouter qu'il y a un site web en face de la partie de cette demande qui serait nécessaire pour déchiffrer les données, sauf si j'ai ajouté une couche.
J'ai regardé ad nauseam, mais personne ne semble avoir une réponse balles.
Est-ce l'un de ces problèmes, où vous avez à régler pour assez bon? Étant donné que je suis de l'utilisation de MySQL et PHP (éventuellement Python) est-il une meilleure façon d'aborder cette question?
- Quel est le but de chiffrement d'une colonne? Sûrement la chose la plus intelligente à faire serait de chiffrer une ligne de données sensibles par le biais de votre application et de stocker du sel le long de la ligne de sorte qu'il est plus difficile à décrypter.
- Je suppose que je voulais dire chiffrer un certain champ de chaque ligne à l'aide de AES_ENCRYPT. Donc, avoir l'application de chiffrer et de déchiffrer est mieux que les fonctions de MySQL ou êtes-vous juste dire que je devrais avoir un unique salé à la clé pour chaque ligne lors de l'appel des fonctions MySQL
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si l'utilisation de MySQL construire dans le chiffrement serait la meilleure solution à votre problème.
PHP M_CRYPT paquet est pensé pour être tout à fait bon et il vous donne la flexibilité de choisir l'algorithme le plus adapté à vos besoins.
Stocker votre clé sur un autre serveur a un gros avantage: la clé n'est pas sur la même machine que les données chiffrées*). Donc, tant que l'attaquant ne dispose pas de suffisamment de contrôle sur la machine compromise, ils ne peuvent pas obtenir à la clé.
Si l'attaquant dispose d'un contrôle total de la machine, les données sont stockées sur, ils seront probablement en mesure d'interroger le service web pour la clé.
Toutefois, la transmission de la clé à partir d'une machine à une autre s'ouvre, une toute nouvelle zone qui doit être garanti. Impliquant probablement plus clé et plusieurs couches de chiffrement, ce qui augmenterait le risque d'erreurs.
*) L'autre option est d'entrer le mot de passe sur le serveur web de démarrage et de ne garder en mémoire.
Solution Possible
Si vu une solution employés qui ont utilisé la méthode suivante pour le cryptage des fichiers pour les utilisateurs avec un accès web (je ne suis pas sûr de votre environnement, mais il pourrait être utile):
(seulement cette colonne est chiffré à ne pas affecter les performances du reste de l'album!)
(La meilleure option est d'entrer le mot de passe à regarder votre serveur et de ne stocker dans la mémoire.)
(Une autre approche serait de laisser à l'utilisateur d'entrer un mot de passe et l'utiliser pour chiffrer/déchiffrer le hasard-la colonne de la clé, mais je ne sais pas si ce qui permettrait d'augmenter ou de diminuer la sécurité)
Les avantages de cette approche sont:
1. L'aléatoire de la clé est crypté dans la base de données. Vous avez donc encore la sécurité accrue de la base de données-serveur, en combinaison avec la colonne chiffrée.
2. Les Documents sont stockés avec des clés différentes, si l'attaquant obtient une clé, seule une partie des documents est compromise.
Cependant:
Si l'attaquant récupère le mot de passe principal et dispose d'un accès en lecture pour l'utilisateur-table, l'ensemble du système, une fois de plus, cassé.
Je serais probablement le stocker dans un fichier qui est dans un non-accessible sur le web directory et verrouillé avec les autorisations de système de fichiers comme beaucoup que possible.
Votre web-face script ne doit pas ouvrir n'importe quel fichier du système de fichiers à l'aide de variables, en particulier fourni par l'utilisateur chers. Ne même pas leur donner la possibilité de glisser quelque chose de passé votre filtre d'entrée (vous êtes filtrage des données fournies par l'utilisateur non?) et, éventuellement, de donner le contenu du fichier de clé. Garder les chemins d'accès de fichier de chaînes codées en dur et de définir()'s seulement. Depuis la plupart de vos données sont stockées dans MySQL, cela ne devrait pas être un problème.
Lors du déchiffrement, de lire la clé dans un correctement initialisé la variable, ne le déchiffrement, puis écraser la variable clé (avec une chaîne de x) et de désactiver la variable. C'est probablement ce que tous les sons un peu paranoïaque, mais si vous réduisez le temps de la clé est en clair dans la mémoire et de l'isoler de toutes les autres variables de voler autour de votre script PHP, il ne peut pas vous faire tout moins sécurisé.
Si vous et l'autre personne sont les seuls qui ont accès physique à la machine, c'est probablement très bien. Si quelqu'un viole et vole la boîte, eh bien, ils ont obtenu toutes vos données de toute façon donc game over.
Il me semble que vous êtes compte tenu de l'utilisation d'une colonne spécifique " clé à utiliser avec 'AES_ENCRYPT" et "AES_DECRYPT'. Comme l'auteur l'a dit, c'est une mauvaise idée, parce que toute intrusion aurez accès à toutes les données.
Si vous utilisez un " fourni par l'utilisateur le mot de passe, avec ou sans sel, vous êtes beaucoup plus sécurisé.
Cela dit, si la clé de chiffrement est uniquement lisible par l'application à l'utiliser, vous êtes probablement "suffisamment bonne". Si la machine est cassée dans, ils vont obtenir vos données plus rapidement avec une seule clé si.