8
votes

Obscurcissant l'identifiant de la base de données

J'ai une table avec une clé primaire qui est incrémentation automatique. Je veux avoir une image associée à la clé primaire, mais je ne veux pas que la clé principale soit révélée. Nommerait les images quelque chose comme: xxx

être une bonne solution?

Je suis inquiet qu'il puisse y avoir une collision et un fichier être écrit.

L'autre option Bien sûr consiste à générer une chaîne aléatoire, vérifiez que cela n'existe pas comme un fichier et le stocke dans la base de données ... mais ID préfère ne pas stocker de données supplémentaires si son inutile.

L'autre option est une transformation logique style URL YouTube URL, par exemple 1 = A 2 = B, mais avec un ordre randomisé, par exemple 1 = x 2 = m ... mais il y en a la chance d'être décodé ... plus MD5 serait probablement Plus léger que toute fonction URL YouTube.

Je suppose que je traite avec plus de deux millions d'enregistrements alors quelle est la capuchon probable d'une collision? Quelle option choisiriez-vous ou pouvez-vous penser à une meilleure approche?


3 commentaires

Quel est le danger si la clé principale de l'enregistrement d'image est découverte?


Si la colonne ID est la clé principale. Cela ne serait pas remplacé cela facilement. Votre dB devrait l'attraper et vous pourriez le gérer en conséquence


non vital de sécurité sage, mais important car il permettrait à un utilisateur de faire un bot et de tromper le système


10 Réponses :


-1
votes

Utilisez simplement un hachage de la clé primaire. Les chances d'y être une collision est la facilité d'utilisation.


1 commentaires

Ce n'est pas une bonne idée d'écrire du code généralement correct, mais vous savez peut échouer (et est garanti d'échouer avec suffisamment d'échantillons), en particulier lorsqu'il y a des solutions faciles au problème.



0
votes

Si vous souhaitez utiliser l'ID, mais ne voulez pas révéler l'ID et vouloir un faible risque de collision; Une option serait d'utiliser un hachage de l'ID. Le hash serait cohérent, irréversible et (à l'exception d'énormes jeux de données énormes - 2 32 sup> ish en fonction du hachage utilisé) unique pour chaque photo. Vous semblez avoir l'idée de base de cela dans votre question:

$filename = md5($primarykey + $secret_string) . '.jpg';


6 commentaires

"Et je ne veux pas de collisions; une option serait d'utiliser un hachage de l'ID". Je pense que vous devriez examiner de plus près les hayes. Les hachages produisent des collisions. C'est pourquoi vous devez les vérifier.


Les hachages ne sont pas censés entrer en collision, mais certaines d'entre elles telles que SHA-0, MD4 et MD5 ont été montrées.


@DANA: Les hashes sont très censées entrer en collision. Leur exigence la plus fondamentale est de cartographier sur un espace d'entrée infiniment important à un espace de production fini et que signifie inévitablement des collisions. Ce que les hachages cryptograhiques ne doivent pas avoir sont des méthodes de provocation des collisions délibérément.


"Les hachages ne sont pas censés entrer en collision" - faux. Ils doivent, sinon quelqu'un vient de trouver la méthode de compression parfaite.


Les hachages cryptographiques ont un risque de collision très faible.


Lisez un peu avant de commencer à scinder et que lorsque les hachages ne sont pas censés être entrés en collision, ils font parfois. Certains algorithmes sont plus résilients que d'autres - MD5 SUCKS, je savais que c'était aspiré et à partir du moment où je frappe Soumettre pensant que je devrais avoir plus directement instruit d'utiliser un meilleur algorithme de hachage.



0
votes

Il y a vraiment deux options que vous avez:

  • Générez quelque chose et vérifie aucune collision
  • génère quelque chose et espère sans collision

    Vous pouvez généralement utiliser les options suivantes: - un hachage - une chaîne générée de manière aléatoire - un UUID

    hash Si vous choisissez un hachage, choisissez quelque chose avec une faible incidence de collisions. En outre, lorsque vous effectuez un hachage, considérez pourquoi vous souhaitez masquer les identifiants de DB. Il ne faudra pas longtemps pour que quelqu'un découvre vos hachages si vous accumulez des chiffres unis, vous devez absolument la sel. Les avantages d'un hachage salé sont une génération rapide et une faible chance de collisions (en petits cas absolument pas de vérifier pour ceux-ci, donc des inserts plus rapides). L'inconvénient est que toute mise en œuvre appropriée sera SHA256 ou mieux, ce qui signifie qu'il est long. Vous pouvez faire des conversions hexagonales si vous souhaitez sauvegarder l'espace DB / Index, cela peut être plus que vous le souhaitez.

    chaîne aléatoire Ceci vous pouvez générer à n'importe quelle longueur qui vous convient, de n'importe quel jeu de caractères ou de numéros A-Z0-9. Cela signifie également des données «plus» dans une chaîne plus courte utilisée dans les URIS, demandez des données, etc. L'inconvénient est que vous devez vérifier si c'est dans la base de données.

    un uuid Comme un hachage, je suis rapide à générer, assez basse chance de collisions et peut être modifié pour être «moins» laids, puis des sorties pures.

    Ma suggestion Ne le fais pas. J'ai dû faire face à cela auparavant sur une très grande implémentation qui a progressé d'être une très petite mise en œuvre. Finalement, vous commencez à faire des choses "intelligentes" telles que la création d'identifiants totalement uniques (par exemple Type de contenu + votre identifiant) et commencez à voir une certaine valeur dedans, mais vous devez alors faire face à l'échelle. La mise à l'échelle c'est très difficile. Les DBS sont optimisés pour les identifiants comme des clés primaires, il y a une grande quantité de pensée surprenante que vous auriez besoin de mettre dans cette question si vous le souhaitez que cela augmente verticalement. Si vous devez, utilisez-le uniquement pour les interactions client externes.


0 commentaires

2
votes

Utilisez un Générateur confortable linéaire . Si vous choisissez correctement les valeurs, vous aurez une séquence Pseudorandom avec une très grande période. Pas de collision, mais noter que ce n'est qu'une méthode d'obfuscation et ne fournira aucune sécurité réelle (mais je suppose que ce n'est pas ce que vous recherchez).


1 commentaires

Notez que si vous souhaitez obtenir une meilleure sécurité, vous pouvez également catérer la sortie du LCG avec un nombre aléatoire cryptographiquement fort. Fondamentalement quelque chose comme $ lcg_string. $ rand_string; De cette façon, LCG prend soin de l'unicité et de la chaîne aléatoire empêche de prédire. (L'attaquant bien informé peut encore découvrir le PK cependant)



1
votes

Généralement pour obscurcir les identifiants de base de données dans les URL, vous chiffreriez réellement l'ID, car l'obscurcissement doit être réversible pour le serveur de rechercher l'enregistrement de la base de données de l'ID obscurci. La réversibilité peut ne pas être aussi importante pour votre cas d'identifiants de base de données de mappage des noms de fichiers, mais c'est un modèle simple qui éliminerait également la possibilité de collisions.

Vous voulez convertir les données cryptées en ASCII à l'aide de BASE64 ou HEX codage, par exemple: xxx

et décodage: xxx

(ci-dessus est pseudo-code, vous devrez trouver Les fonctions appropriées en PHP)

Vous n'avez pas besoin de quelque chose de trop chic pour le cryptage. Un chiffre de bloc simple comme des des des devtia.


0 commentaires

1
votes

Le code que vous avez fourni est bien adapté pour faire le travail. Vous n'avez pas à vous soucier des collisions, pas d'entier que vos bases de données utilisent entraîneront le même hachage de MD5 comme tout autre.

Si vous voulez être vraiment sûr: Voici un script de test Litte;) xxx

une solution plus complexe semble être une perte de déchets de Votre temps, mais au cas où vous voudriez des identifiants plus courts, vous pouvez donner une carte d'identité générée aléatoire courte à chaque image (et vérifiez s'il a été déjà utilisé sur le temps de génération et générer un autre si tel est le cas)


0 commentaires

0
votes

Je suis d'accord sur l'utilisation de base64. Vous pouvez également utiliser un GUID. Ou stockez simplement le nom du fichier dans la table, ce que j'ai fait.

En plus, faites attention à éviter les fichiers orphelins.


0 commentaires

0
votes

Un algorithme de hachage telle que MD5 n'est pas une bonne solution pour cela, comme des haltes par définition pour ne pas assurer l'unicité (ils créent des hachages qui ont un nombre fini de valeurs).

Ce que vous voulez est un cryptage. Javax.crypto.cipher.


0 commentaires

2
votes

Je devinerais que je traite avec plus de deux millions d'enregistrements alors quel est le capot probable d'une collision?

Selon Wikipedia , vous aurez besoin de plus de 2 * 10 ^ 19 enregistrements à Obtenez une probabilité de 50% d'avoir au moins une collision, alors je dirais que vous n'avez pas à vous inquiéter.


0 commentaires

0
votes

Si vous pouvez ajouter une colonne, ajoutez un GUID en tant que colonne unique dans la table et utilisez le .jpg comme nom de clés. Les algorithmes de GUID ne doivent pas produire de duplicats dans le futur avisé, mais juste au cas où la contrainte unique attraperait ceci.


0 commentaires