web-dev-qa-db-fra.com

Comment faire un champ crypté recherché?

J'utilise attr_crypted pour stocker de nombreux champs. Problème est que j'ai besoin de pouvoir chercher certains de ces champs.

Prendre User.name.

Ma base de données actuelle a User.e_name et User.e_name_iv. Bien que cela semble être raisonnablement sécurisé, Je ne peux pas rechercher ma base de données pour "Joe Bloggs".

Hachage

J'ai ensuite envisagé d'ajouter un troisième champ haché (User.e_name_hash) qui pourrait être utilisé pour trouver un champ basé sur le terme de recherche haché. La recherche 'Joe Bloggs' est donc hachée, par rapport à toutes les autres entrées hachées, et l'enregistrement requis est trouvé. Mais pour faire cela, je devrais avoir un sel constant sur toutes les données dans ce domaine de ce tableau (également insécurité).

Impasse

Ayant appris qu'un sel constant est horriblement insécurisé, je suis à court d'idées sur la meilleure façon de créer des champs cryptés consultables. Mes options sont:

  1. Laissez ces champs en clair.
  2. Gardez ces champs cryptés et ajoutez un champ haché avec quelque chose comme un long sel constant avec SHA512 (le sel serait constant dans tous les enregistrements de chaque champ de base de données, mais unique à ce champ).
  3. Demandez à ma base de données sur chaque enregistrement chaque fois qu'une recherche est nécessaire (faisable maintenant mais inefficace que le volume augmente).

Notez que les champs que j'ai besoin pour rechercher ne sont pas Super haute sensible - Ils ne sont pas apparentés aux dossiers médicaux ni aux informations classifiées.

Quelles sont vos recommandations?

4
sscirrus

Vous connaissez déjà la réponse: 3 Si vous voulez une sécurité.
[.____] Si cela devient trop lent, vous aurez besoin d'un meilleur ordinateur, ou plus d'un. Aussi simple que cela.

Quoi qu'il en soit, s'il vous plaît ne pensez pas que vous puissiez décider à quel point les données sont sensibles, parce que cela varie considérablement pour différentes personnes et situations. Real Story: une personne perdant 20% du revenu annuel car il était connu qu'il a mangeait la glace à la vanille. Vous ne pouvez pas imaginer comment cela peut arriver? Exactement, c'est pourquoi: Ne décidez pas d'autres personnes quoi garder le secret et ce qui n'est pas. .

2
user155462

Jetez un coup d'œil à cryptdb . Il chiffre toute la base de données et exécute des requêtes sur les données cryptées sans le décrypter sur le côté DB. Vous devez modifier votre application un peu pour travailler avec CryptDB, mais les auteurs déclarent que ce sont des modifications mineures. C'est complètement la langue agnostique.

Voici le whitepaper décrivant comment cela fonctionne.

1
Daniel Szpisjak

Si vous avez besoin de conserver vos données chaudes (données qui sont interrogées) sous forme cryptée, décrypte comme vous la recherche, cela ralentira votre base de données et cela vous empêcherait également de faire une optimisation de la recherche avancée, car vous allez essentiellement faire Table complète scanne à chaque fois. L'autre option est TDE.

  • TDE (cryptage de données transparentes), la plupart des fournisseurs de base de données le supportent maintenant. Et il est essentiellement crypté dans les fichiers de tablespaces, vos tables sont cryptées pendant le repos et le non crypté pendant qu'ils sont chauds. Cela vous donne une bonne posture de sécurité si vous souhaitez que vos sauvegardes soient sécurisées et trasportables. Cette méthode échoue grandement, Apple l'utilise probablement probablement.

j'espère que cela t'aides. Si vous clarifiez ces exigences, je peux revenir en arrière et modifier ma suggestion.

  • Votre accès de données est-il une application qui a utilisé les données sécurisées?
  • Quel fournisseur de base de données avez-vous? Oracle, MySQL, MSSQL.
  • Est-ce que vous magasinez l'une des grandes données S?
  • Est-ce que vous basé sur la base de données?
  • Avez-vous le contrôle et l'accès à votre base de données?
0
Hugo R

Yup, cela semble être une impasse bien. Si vous recherchez un camion crypto intelligent, vous n'en trouverez pas un.

L'une des propriétés est le cryptage s'appelle Indistinguistionnâtrabilité de Ciphertext qui dit que donner un ciphertext et une chaîne aléatoire, et l'attaquant ne doit pas pouvoir dire lequel est lequel. En tant que corollaire, si vous avez trois ciphertextes, deux d'entre eux sont venus du même texte clair, l'attaquant ne devrait pas être capable de dire lequel. C'est le point d'utiliser des sels uniques ou des IV uniques pour chaque enregistrement.

L'idée d'être capable de rechercher des affrontements surextextoires à un niveau fondamental avec une indistermination de CIPHertext.

L'implication ici est que vous ne pouvez pas chiffrer vos touches de recherche et garder toujours une sorte de performance. Vous allez avoir besoin de choisir quelles choses sont sensibles et acceptent que ce ne sont pas consultables. Vous pourrez peut-être concevoir autour de cela dans une certaine mesure en collaborant des identifiants aléatoires sur tout et en ayant plus de tables de recherche.

0
Mike Ounsworth