Crypter et décrypter un hash

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 656 fois - Téléchargée 14 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

shenron666
Messages postés
231
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
-
J'ai du mal à comprendre, si tu avais à stocker en BDD un mot de passe, tu stockerais le hash ou le hash crypté ?
rayman223
Messages postés
24
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
7 avril 2013
-
Le hash crypté. Comme ça, si la table est piratée, le pirate ne pourra pas trouver une chaine qui correspond au hash puisque celui-ci est modifié.
shenron666
Messages postés
231
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
-
je me demande s'il n'y a pas un problème avec l'exemple est visible sur http://www.blizer.net/exemple.php
vu que le hash crypté affiché est le mot de passe décoré :
SEL_DEBUTMon_super_mot_de_pasSEPARATEUR_DEBUTnwxmqSEPARATEUR_FINse_08SEL_FIN

ce qui ne semble pas être le cas dans ton code
rayman223
Messages postés
24
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
7 avril 2013
-
C'est juste un exemple.
Cela te permet de visualiser la structure du cryptage plus facilement qu'avec un vrai hash.
Tu dois voir cette exemple comme si "Mon super mot de passe" était un hash.
shenron666
Messages postés
231
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
-
Ok je comprend mieux, merci pour tes explications.
De plus ton code est assez clair et un minimum commenté, ça aide.

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.