Question

Je viens de découvrir Stack Overflow et je vérifie simplement s'il existe des idées pour une contrainte que je rencontre avec des amis dans un projet, bien qu'il s'agisse davantage d'une question théorique à laquelle j'ai déjà été confronté. essayer de trouver une réponse pendant un certain temps.

Je ne suis pas très habitué à la cryptographie, mais si je ne suis pas assez clair, je vais essayer de le modifier / commenter pour clarifier les questions.

En essayant d’être bref, l’environnement ressemble à quelque chose comme ceci:

  • Une application où le serveur frontal comme accès pour chiffrer / déchiffrer les clés et le serveur principal est uniquement utilisé pour le stockage et les requêtes.

  • Avoir une base de données à laquelle vous ne pouvez pas accéder pour quelques champs, par exemple, disons "adresse". qui est text / varchar comme d'habitude.

  • Vous n'avez pas accès à la clé pour déchiffrer les informations et toutes les informations arrivent à la base de données déjà chiffrée.

Le problème principal est le suivant: comment faire des requêtes de manière cohérente dans la base de données, il est impossible de faire des choses comme "où une adresse comme"% F & # 167; YU / & # 180; ~ # JKSks23% "" . (SI quelqu'un a le sentiment de trouver une réponse à cette question, n'hésitez pas à le prendre).

Mais est-il possible de faire où address = '& # 177;! NNsj3 ~ ^ & # 186; -:' ? Ou serait-il aussi complètement manger la base de données?

Une autre restriction qui pourrait s’appliquer est que le serveur frontal ne dispose pas de beaucoup de puissance de traitement. Par conséquent, le cryptage / décryptage des informations commence déjà à le pousser à bout. (Dites ceci simplement pour éviter les réponses telles que "Exporter une jointure de tables vers le serveur frontal et l'interroger là-bas".)

Quelqu'un pourrait-il m'indiquer une direction pour continuer à y penser?

Eh bien, merci d'avoir répondu si rapidement à 4 heures du matin. Pour la première fois, je suis vraiment impressionné par cette communauté. (Ou peut-être que je suis juste pour le fuseau horaire différent)

Je ne fais que donner des informations:

Le problème principal concerne la correspondance partielle. Une exigence obligatoire dans la plupart des bases de données est d'autoriser les correspondances partielles. La contrainte principale est en réalité le propriétaire de la base de données ne serait pas autorisé à rechercher des informations dans la base de données . Au cours des 10 dernières minutes, j'ai trouvé une solution possible qui s'étend à nouveau aux éventuels problèmes de base de données, à laquelle j'ajouterai ici:

Solution possible pour permettre la correspondance semi-partielle:

  • Le mot de passe + quelques champs publics de l'utilisateur constituent en réalité la clé de cryptage. Pour l’authentification, l’idée est de chiffrer une valeur statique et de la comparer dans la base de données.
  • Création d'un nouvel ensemble de tables dans lesquelles les informations sont stockées de manière analysée, ce qui signifie quelque chose comme: "4th Street". deviendrait 2 lignes cryptées (une pour le 4ème, une autre pour la rue). Cela permettrait déjà une correspondance semi-partielle, car une recherche pourrait déjà être effectuée sur les tables séparées.

Nouvelle question:

  • Cela risque-t-il de détruire le serveur de base de données ou est-ce que quelqu'un pense qu'il s'agit d'une solution viable pour le problème de correspondance partielle?

Post-scriptum: la réponse de Cade Roux n’a pas été acceptée pour permettre une discussion plus approfondie et, en particulier, une éventuelle réponse à la nouvelle question.

Était-ce utile?

La solution

Vous pouvez le faire comme vous le décrivez - interroger efficacement le hachage, par exemple, mais peu de systèmes répondent à cette exigence car, à ce stade, les exigences de sécurité interfèrent avec d'autres exigences pour que le système soit utilisable - c'est-à-dire pas de configuration partielle. correspond, puisque le cryptage le règle. C'est le même problème avec la compression. Il y a des années, dans un très petit environnement, je devais compresser les données avant de les mettre au format de données. Bien entendu, ces champs ne pourraient pas être facilement recherchés.

Dans une application plus typique, les clés vont finalement être disponibles pour quelqu'un de la chaîne - probablement le serveur Web.

Pour le trafic utilisateur final, SSL protège ce canal. Certains commutateurs réseau peuvent le protéger entre le serveur Web et la base de données. Stocker des données chiffrées dans la base de données est acceptable, mais vous n’allez pas interroger de telles données.

Et une fois que les données sont affichées, elles sont disponibles sur la machine. Ainsi, tout dispositif informatique à usage général peut être contourné à ce stade et vous disposez de défenses de périmètre en dehors de votre application qui entrent réellement en jeu.

Autres conseils

pourquoi ne pas chiffrer le disque contenant les tables de la base de données, chiffrer les connexions à la base de données et laisser la base de données fonctionner normalement?

[Je ne comprends pas vraiment le contexte / les contraintes qui nécessitent ce niveau de paranoïa]

EDIT: "contraintes de loi" hein? J'espère que vous n'êtes impliqué dans rien d'illégal, je détesterais être un accessoire par inadvertance ... ;-)

Si les - ahem - contraintes légales imposent cette solution, c’est tout ce qu’il reste à faire - aucune correspondance LIKE et réponse lente si les machines clientes ne peuvent pas la gérer.

Il y a quelques mois, je suis tombé sur le même problème: toute la base de données (à l'exception des index) est cryptée et le problème des correspondances partielles est soulevé.

J'ai cherché sur Internet une solution, mais il semble qu'il n'y ait pas grand-chose à faire à ce sujet, mais une "solution de contournement".

La solution que j'ai finalement adoptée est la suivante:

  1. Créez une table temporaire avec les données du champ sur lequel la requête est exécutée, déchiffrée et un autre champ qui est la clé primaire de la table (évidemment, ce champ n'a pas à être déchiffré tel quel. texte brut).

  2. Effectuez la correspondance partielle sur cette table temporaire et récupérez les identifiants.

  3. Interrogez la table réelle sur ces identificateurs et renvoyez le résultat.

  4. Supprimez la table temporaire.

Je suis conscient que cela suppose un temps système non négligeable, mais je n'ai pas trouvé d'autre moyen d'effectuer cette tâche lorsqu'il est impératif que la base de données soit entièrement cryptée.

En fonction de chaque cas particulier, vous pouvez filtrer le nombre de lignes insérées dans la table temporaire sans perdre de données pour le résultat (considérez uniquement les lignes appartenant à l'utilisateur qui effectue la requête, etc.). ..).

Vous voulez utiliser le hachage md5. Fondamentalement, il prend votre chaîne et la transforme en un hachage qui ne peut pas être reproduit. Vous pouvez ensuite l'utiliser pour valider par la suite. Par exemple:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "INSERT INTO addresses (address) VALUES ('" . md5($salt . $address) . "')";
mysql_query($sql);

Ensuite, pour valider une adresse dans le futur:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "SELECT address FROM addresses WHERE address = '" . md5($salt . $address) . "'";
$res = mysql_query($sql);
if (mysql_fetch_row($res))
    // exists
else
    // does not

Maintenant, il est crypté du côté de la base de données afin que personne ne puisse le découvrir - même s’ils ont consulté votre code source. Cependant, trouver le sel les aidera à le décrypter.

http://fr.wikipedia.org/wiki/MD5

Si vous devez stocker des données sensibles que vous souhaitez interroger ultérieurement, nous vous recommandons de les stocker en texte brut, en limitant au maximum l'accès à ces tables.

Si vous ne pouvez pas faire cela et que vous ne voulez pas de temps système dans le serveur frontal, vous pouvez créer un composant dans le serveur principal, exécuté sur un serveur, qui traite les données cryptées.

Faire des requêtes sur des données cryptées? Si vous utilisez un bon algorithme de cryptage, je ne vois pas comment faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top