0
votes

Comment créer un identifiant de document Firestore Safe basé sur une chaîne

Après une discussion sur ma question à propos de Base64 ne faisant pas de sécurité pour les identifiants Firestore ICI Je voudrais savoir comment on peut encoder une chaîne à un identifiant de document« Safe »Firestore.

Voici le problème:

  • Je suis connecté aux utilisateurs via un service d'authentification personnalisé.
  • Ce service fournit un nom d'utilisateur que peut contenir / non sûr pour les ID de document Firestore comme déclaré ICI

    J'ai demandé à propos de la base64 dans une autre question et qui n'est pas en sécurité car elle contient /

    Alors, quel pourrait être un moyen sûr de coder cette chaîne sans perdre l'entropie du nom d'utilisateur que le service externe fournit. Cela signifie qu'il pourrait y avoir un nom d'utilisateur tel que dimi / test1 et un autre comme dimitest1 alors simplement des caractères de dénudage n'est pas une option.

    Également depuis que ce service dispose d'une API open et de mon service expose l'ID de document via URLS, je voudrais ne pas exposer les autres noms d'utilisateur du service via mes URL d'applications.

    Toute suggestion?


6 commentaires

Puis-je demander pourquoi vous voulez (en tant qu'utilisateur) de générer l'ID? Firestore dispose déjà d'un générateur d'identifiant de sécurité unique et de Firebase Auth. L'un de ceux-ci devrait vous donner des identifiants uniques pour vos nécessités.


@Ignaciobustos Je ajoute dans une file d'attente que j'ai besoin d'accès sans interruption. Donc, si je peux toujours construire le même identifiant, je peux accéder à cela plus rapidement et avec moins de lecture / écrit. Imaginez que ce soit un service / une fonction d'API qui obtient environ 100 000 appels par jour. est-ce que cela aide?


@Ignaciobustos En outre, je ne sais pas tous les éléments d'une file d'attente en double. L'entrée que je reçois des appels API est la suivante: nom d'utilisateur / workoutid.


@Ignaciobustos Vous pouvez également le considérer comme une cartographie à l'entraînement des utilisateurs de chaque service. Donc, même si l'utilisateur sur ce service met à jour les informations, le même élément de la file d'attente est mis à jour et le moins cher


Oh, je reçois cela très cher d'appeler Firebase pour cela. Alors laissez-moi supposer plus de choses et me corriger sinon. "Userid '(a) &" workouid "(b) est-il connu, n'est-ce pas? Dans ce cas, votre nouveau RelationalDB peut être $ {userid} $ {workoutd} sans aucune barre oblique / dedans. Si vous ne connaissez pas l'IDS à l'avance, j'ai une autre approche pour générer des identifiants rapidement et fiables, mais il est obligatoire d'utiliser Node.js pour des raisons de sécurité. Faites-moi savoir et je vous écrirai à vous l'approche.


J'ai ajouté une réponse directement au cas où vous auriez besoin de générer complètement les IDSHTTPS: //stackoverflow.com/a/62775792/1240074


3 Réponses :


-1
votes

J'ai utilisé base58 et c'était le plus sûr que je puisse rechercher pour


1 commentaires

pourquoi ne pas utiliser hash ex. SHA256? C'est une longueur fixe et son pool de caractères sont [a-fa-f0-9] Stackoverflow.com/a//a/ 12618366 tout en préservant l'entropie.



2
votes

Utiliser Encoduri () suivi de SHA256. Cela contrainte l'ID de document à

Must be valid UTF-8 characters
Must be no longer than 1,500 bytes
Cannot contain a forward slash (/)
Cannot solely consist of a single period (.) or double periods (..)
Cannot match the regular expression __.*__


4 commentaires

Ses documents de 1 m dans chaque appel. WONT SHA256 nécessite plus de CPU et pourquoi pas Base58?


Que diriez-vous de «nouveau texturexoder ('utf-8'). Encodé (message);« En ce qui concerne URF-8?


Pourquoi ne pas simplement utiliser le codéveloppeur ('dimi / test1')?


@ Harsh989 Certains caractères ne sont pas échappés dans un encodeur.



1
votes

edit

Afin de transformer des chaînes en uniques d'utilisation très rapide crypto.createhash () à la place. Le résultat sera le même pour une entrée de chaîne donnée.

Vous pouvez utiliser MD5 ou SHA256, car les deux prises à la fois, la moyenne 2.2S pour calculer 1 million d'identifiants uniques.

ici est le code: xxx

réponse précédente

J'ai adapté le code de FireBase et le rendit disponible directement sur votre noeud. JS avec un test personnalisé pour vous. Il prend jusqu'à 3 ans pour 1 million d'identifiants et seulement 300 ms pour 100 000 ID qui est votre approche d'utilisation quotidienne considérée.

Ceci utilise Crypto considéré très sûr si elle est utilisée dans le nœud.js Environnement.

Voici la fonction enveloppée avec l'exemple d'utilisation: xxx

Utilisez simplement noeud thisfile.js et vous verrez Votre résultat.

Puisque Firebase est principalement open source, nous pouvons trouver le générateur officiel actifié utilisé dans nœud.js pour générer les identifiants ici: https://github.com/googleapis/nodejs-firestore/blob/4f4574afaa8cf817d06b5965492791c2eff01ed5/dev /src/util.ts#l52

important

Si vous allez rejoindre 2 IDS, n'utilisez aucune barre oblique / , comme vous le savez qu'il n'est pas autorisé, utilisez plutôt Underscore _ ou rien du tout puisque vous avez le contrôle de la longueur d'un identifiant, T A Personne, vous devriez savoir comment scinder l'ID en conséquence (40 octets contiennent 2 ID de 20 octets par exemple).

La limitation de Firestore dans les identifiants de document est de 1500 octets afin que vous ayez beaucoup à jouer avec.

Plus d'infos: https://firebase.google.com/docs/ Firestore / quotas # limite


6 commentaires

Je sais que vous avez pris du temps pour écrire cela et pour que je vous remets à coup sûr. Cependant (et répondre également au commentaire), je reçois les identifiants des autres (API). $ {userid} $ {workoutd} ne fonctionnerait pas comme l'URI ultérieurement peut être exposé. On pourrait utiliser ceux (d'une URI partagée). Je voudrais donc que ceux qui laisse dire: "base58?" Crypto? Donc, 2 entrées (UserID, WorkoutID) devraient donner un ID Firestore unique. Je pense (de ce que je comprends) cette réponse ne le fait pas correctement? J'apprécie que vous avez pris le temps de m'apprendre à créer des identifiants (et d'utiliser) mais ceux-ci sont donnés: - /


Pour être un peu plus utile, peut-être: Github. com / jimmykane / quantifié-auto / blob / maître / fonctions / s rc / ... Voir comment un élément de la file d'attente est inséré.


Ok je vois, donc vous voulez que le generateidfromptarts pour générer la même chaîne pendant que l'entrée est la même, quelle que soit la mesure que vous appelez à nouveau la fonction avec la même entrée?


Correct! Maintenant, je code de base58. Selon mes recherches, c'est bien, mais j'ai peur des collisions, etc. De plus, ma propre réponse est également évitée, elle commence donc à sentir si vous avez mon point.


Vous pouvez transmettre les deux identifiants concaténés comme uniqueId ({$ {userid} $ {workoutid} `) pour obtenir le même résultat toujours


Vous pouvez également digérer le hachage de manière différente d'obtenir des résultats uniques plus complexes comme 'utf-8', plus d'info NODEJS.ORG/API/...