Crypter et décrypter un hash

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 927 fois - Téléchargée 15 fois

Contenu du snippet

Ce script permet de rajouter des sels au début et en fin d'un hash mais aussi au milieu. De ce fait, le hash devient totalement unique et inutilisable par des pirates.

Le hash sera transformé comme suit :
hash = Voici_mon_Hash
le hash crypté sera :
Sel_début Voic Séparateur_début Chaine_de_caractère_aléatoire_(a-z 0-9) Séparateur_fin i_mon_Hash Sel_fin

Note : les espaces sont inexistant. Ils sont placé pour améliorer la visibilité dans ce cas.
La chaine de caractère :
Séparateur_début Chaine_de_caractère_aléatoire_(a-z 0-9) Séparateur_fin
Va se placer aléatoirement dans le hash le rendant unique.

La fonction decrypt_hash permet de décrypter le hash et donc de pouvoir le comparer avec un autre hash (pour une vérification de login par exemple).

Source / Exemple :


<?php
/*
Script de cryptage de hash
Créé par Okuni
http://www.blizer.net
Codes-Source : http://www.phpcs.com/codes/CRYPTER-DECRYPTER-HASH_55040.aspx

  • /
define('SEL_DEBUT', 'djrt5'); define('SEL_FIN', '78f56'); define('SEPARATEUR_DEBUT', 'ei649'); define('SEPARATEUR_FIN', 'gj8j7'); define('LENGT_MILIEN_MIN', 5); define('LENGT_MILIEN_MAX', 15); function random_car($min, $max) { // Récupération d'un nombre aléatoire entre LENGT_MILIEN_MIN et LENGT_MILIEN_MAX $lenght = mt_rand($min, $max); $string = ''; $chaine = 'abcdefghijklmnpqrstuvwxyz0123456789'; srand((double)microtime()*1000000); for($i = 0; $i < $lenght; $i++) { $string .= $chaine[rand()%strlen($chaine)]; } return $string; } function crypt_hash($mdp) { // Hash $hash = hash('sha512', $mdp); // Enlève les séparateurs $hash = str_replace(SEPARATEUR_DEBUT, '', $hash); $hash = str_replace(SEPARATEUR_FIN, '', $hash); // Ajout du sel du milieu $sel_milieu = SEPARATEUR_DEBUT . random_car(LENGT_MILIEN_MIN, LENGT_MILIEN_MAX) . SEPARATEUR_FIN; // Ajout du sel du milieu dans le hash $lengt_start = mt_rand(0, strlen($hash)); $mdp_gauche = substr($hash, 0, $lengt_start); $mdp_droite = substr($hash, $lengt_start); echo '<p>mdp_gauche : '.$mdp_gauche.'</p>'; echo '<p>mdp_droite : '.$mdp_droite.'</p>'; echo '<p>lengt : '.strlen($hash).'</p>'; echo '<p>lengt_start_1 : '.$lengt_start.'</p>'; $hash_crypte = SEL_DEBUT . $mdp_gauche . $sel_milieu . $mdp_droite . SEL_FIN; return $hash_crypte; } function decrypt_hash($hash_crypte) { // Enlever le sel du début et de fin $hash_crypte = str_replace(SEL_DEBUT, '', $hash_crypte); $hash_crypte = str_replace(SEL_FIN, '', $hash_crypte); // Enlever le sel du milieu $hash = preg_replace('#('.SEPARATEUR_DEBUT.'[a-z0-9]+'.SEPARATEUR_FIN.')#', '', $hash_crypte); return $hash; } $mdp = 'Mon_super_mot_de_passe_08'; $hash = hash('sha512', $mdp); $hash_crypte = crypt_hash($mdp); echo '<p>Mot de passe ('.strlen($mdp).') : <strong>'.$mdp.'</strong></p>'; echo '<p>Hash (sha512) ('.strlen($hash).') : <strong>'.$hash.'</strong></p>'; echo '<p>Hash crypté : ('.strlen($hash_crypte).') <strong>'.$hash_crypte.'</strong></p>'; echo '<p>Hash décrypté : ('.strlen(decrypt_hash($hash_crypte)).') <strong>'.decrypt_hash($hash_crypte).'</strong></p>'; ?>

Conclusion :


Un exemple est visible sur http://www.blizer.net/exemple.php.
Le mot de passe introduit est "Mon_super_mot_de_passe_08" (voyez ça comme un hash).
Entre parenthèse est indiqué la longueur de la chaine.

mdp_gauche et mdp_droite représente les 2 parties du mot de passe. Le sel se mettra au milieu
lengt_start est l'emplacement du caractère où l'on va couper le hash en 2.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014

Est ce que c'est la dernière version, corrigée et rectifiée ?

merci
Messages postés
24
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
7 avril 2013

Pour la ligne 36 et 37 celà permet d'être sur que les séparateurs se se trouvent pas déjà dans le chaine.

Alors, je devrais faire le hash à la fin et non au début.
Rectification quant à la longueur de base 2 du hash: Étant donné que ce n'est pas le cas pour sha1 par exemple, je dirais plutôt que la longueur est exotique et aléatoire dans le cas présent.
- Les instructions lignes 36-37 n'ont aucune utilité.
- La "chaine" finale n'a pas une longueur de base 2 + on a les séparateurs et sels en clair, ce qui les rends aisément identifiables.
- Pourquoi mélanger rand() et mt_rand() ?

Bref, si je vole une table avec les passwords, je lis 3-4 lignes à la recherche d'un motif répétitif, je fais un sed pour les virer et je lance un bruteforce (ici, ce sera compliqué vu que c'est du sha512)

Non, chiffrer un hash n'a aucune utilité, surtout de cette manière.

Une façon simple de rendre un hash théoriquement incassable et sans aucun sel, c'est de hasher plusieurs fois consécutives la chaîne (2 suffira largement). On a une information en moins à stocker (le sel) et ça rends le hash théoriquement incassable.

Et parler de hash unique, c'est pareil que de dire que personne d'autre n'a le même "Prénom NOM" que moi: c'est absolument faux par nature.
Messages postés
134
Date d'inscription
samedi 19 octobre 2002
Statut
Membre
Dernière intervention
3 janvier 2009

@shenron666

Pour ce qui concerne la différence entre "chiffrement" et "cryptage", je vous conseil de lire ceci : http://www.ssi.gouv.fr/IMG/pdf/RGS_B_1.pdf En page 29 de ce document il est écrit : "D'un point de vue vocabulaire, il faut noter que le seul terme admis en français est celui de chiffrement. On entend cependant souvent parler de « cryptage » qui est un anglicisme popularisé par les télécommunications, voire de « chiffrage », mais ces mots sont incorrects. L'opération inverse du chiffrement est le déchiffrement. On désigne par « décryptage », ou « décryptement », l'opération qui consiste à retrouver le clair correspondant à un chiffré donné sans connaître la clé secrète, après avoir trouvé une faille dans l'algorithme de chiffrement."

Donc par abus de langage, pour beaucoup de personne, chiffrement <=> cryptage ... donc mieux vaut parler de chiffrement.

Un hash est l'équivalent d'une empreinte digitale, d'une donnée (chaine de caractère, fichier, etc...) à partir d'un hash il n'est pas possible de reconstituer la donnée initial. On dit qu'une fonction de hash est une fonction à sens unique. Une fonction de hash sert principalement à vérifier que 2 données sont identique ou l'intégrité d'une données.
Afficher les 19 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.