Quelle fonction PHP cryptage full bijectif

WRInaute accro
Bonjour

Je cherche à utiliser des codes unidirectionnels à la place de mes noms de jockeys.

Le but est de ne pas conserver les noms en clair dans ma bdd.

Le seul critère nécessaire est le caractère entièrement bijectif de ce codage / cryptage.

Il faut que deux jockeys différents ( de prénom/nom normalisés en majuscules ) ne puissent avoir un code identique.

En d'autres termes, il faut que je puisse adapter à la table COURSES, un index unique sur les champs : ID, NUMJO etc RANG.

NOMJO est le code du jockey d'index numerique NUMJO.

RANG est le rang d'arrivée de NUMCH qui n'a pas besoin de figurer dans l'index de COURSES.

RANG=20 => rang d'arrivée non connu.

Je ne peux pas faire celà avec la fonction hash('sha256', $nomjo), qui n'est pas entièrement bijective.

Et puis ce serait un plus si les codes étaient de longueur suffisamment limitée ( exemple 64 caractères ).

Merci beaucoup de votre aide.
 
WRInaute accro
Bonjour

password_hash() pourrait résoudre ce problème, à la condition de l'unicité du hash résultant, avec un salt constant par nom de jockey.

Le salt pourrait être généré de manière injective, ç-à-d qu'à un nom de jockey en clair, ne corresponde qu'un seul salt.

A cette condition, est-ce que password_hash() est bijectif ?

Il y a aussi le problème de l'algorithme utilisé, qui pourrait être adapté avec

password_verify() et password_needs_rehash()

en fonction de l'évolution des algos.

Merci beaucoup de votre aide.
 
WRInaute accro
Bon bon

Erreur : Les hash résultants sont différents pour le même NOMJO en clair, donc la seule solution consisterait à associer ces NOMJO à des identificateurs dans la bdd, tels qu'à un NOMJO en clair, l'identificateur correspondant serait connu, pointerait sur le code hash dans la bdd, à charge de tester la justesse du hash avec password_verify().

Mais c'est le serpent qui se mort la queue.

Il me suffit de trouve le mode de calcul de l'identificateur, qui doit être différent pour deux NOMJO en clair différents.

Donc même problème.

password_hash() est variable donc çà ne marche pas.

crypt() n 'est pas bijectif.

Quoi d'autre ?

Il me faudrait un algorithme genre UUID avec NOMJO comme paramètre mais rendant la même valeur pour un NOMJO.

Que faire ?

Merci beaucoup.
 
WRInaute accro
Résultat.

Avec des codes de 250 octets :

Code:
        $algorithm      = whirlpool

        $password       = MR:A.:ABRIVARD

        $salt           = 61e70edd76e0b02e

        $hash           = a075e2bab2eb1a91030aa5dff6826bdfe84e52a5b4a6c146d8a7dfcd08e7293b67f78c22cc83b53bf11bb21eceb058bfb94a872023cbb58141a3906175cdd95e489542f0787690dacefb7f8aaa9f384684bad1f14f3ab8eaa477644295327ea78b6768dd056164e68426e57feb234c4de0316d7efde26051cd47166063


Le salt est calculé d'après le nom en clair. ( autre fonction que hash() ).

Deux noms différents donnent des salts différents.

J'ai trouvé la fonction d'algorithme PBKDF2 sur php.net.

La probabilité de collision est certainement nulle.

Deux noms identiques donnent deux codes ( 250 bytes ) obligatoirement différents.

A priori mes deux fonctions ( salt et code ) conviennent.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut