Crypter et décrypter un hash

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

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.