Ajouter son grain de sel dans un mot de passe

Un grain de sel dans le cryptage de MDP

Description & concept

Cette technique est notamment utilisée par UNIX et permet de se protéger en cas de vol du hash md5. Comme une même chaîne donne toujours le même hash avec md5, si on chiffrait tous les mots de passe probables avec md5 (ou au moins un très grand nombre) on pourrait à partir d'un hash retrouver le mot de passe en clair. La constitution d'un tel dictionnaire prend du temps et doit être faite à l'avance, toutefois elle est envisageable. La parade se fait par l'introduction d'un grain de sel qui va "déformer" le hash. Ce grain de sel est en fait un très grand nombre que l'on concatène au mot de passe avant de le chiffrer, mais un exemple éclairera tout :

$motDePasse = "toto"; $hash = md5($motDePasse);


$hash contient alors f71dbe52628a3f83a77ab494817525c6 qui est le hash de toto. Si l'on avait un dictionnaire avec tous les hashs possibles, on pourrait alors associer f71dbe52628a3f83a77ab494817525c6 à toto et donc avoir le mot de passe.
Maintenant, voilà une application du grain de sel : (on utilise la fonction rand(), qui créée un nombre aléatoire de 10 chiffres)

$motDePasse = "toto"; $grainDeSel = rand(); $hash = md5($motDePasse.$grainDeSel);

$grainDeSel n'est pas secret, est propre à chaque utilisateur et est stocké en clair dans la base de données. Pour retrouver $motDePasse à partir de $hash, il faudrait donc maintenant un dictionnaire de tous les mots de passe possibles, concaténés avec $grainDeSel. Nous avons déjà dit que la réalisation d'un dictionnaire doit être faite à l'avance, c'est à dire à un moment où on ne connait pas $grainDeSel. Il faudrait donc réaliser un dictionnaire pour chaque grain de sel possible, ce qui est inenvisageable.

Pour contrer cette technique, des logiciels prenant en compte la technique des grains de sel ont été inventés. Ils sont en mesure de prendre en compte des techniques assez complexes comme l'algorithme de la fonction 'crypt' de PHP (MD5(hex(MD5(pass))) hash de la forme hexadécimale du hash du mot de passe), ou dîtes MD5MDS (MD5(MD5(pass).salt) hash du hash du mot de passe concaténé à un grain de sel).

THE FEINTE !

La technique de salage permet d’empêcher des attaques de type « lookup tables » et « rainbow tables » (tables de mots connus / communs / prévisibles / majoritairement utilisés dans les mots de passe) mais ne permet pas d’empêcher une attaque de type brute force par exemple.
L’idée ici est de rendre le mécanisme de hash très très TRES lent de façon à ce que même via un GPU ou autre le mécanisme de brute force n’en vaille tout simplement plus la peine tant il sera long.
ATTENTION à ne pas utiliser un algorithme maison pour ralentir le hashage car il pourra être lancé en parallèle au niveau hardware (hardware fork) et donc revenir à une vitesse de décryptage normale. Il est conseillé d’utiliser des algorithmes standards tels que PBKDF2 ou BCRYPT. Ils vont permettre de déterminer la vitesse à laquelle le mécanisme de hashage sera exécuté. L’objectif ici sera de faire suffisamment de tests pour allonger la durée à 0,5 secondes. De cette façon le programme sera aussi protégé que possible tout en limitant les effets sur l’expérience utilisateur.

 

Cryptographically Secure Pseudo-Random Number Generator (CSPRNG)

Voici les librairies qui permettent de générer des « salt » complexes (non prédictibles) :

 

Platform CSPRNG
PHP mcrypt_create_iv, openssl_random_pseudo_bytes
Java java.security.SecureRandom
Dot NET (C#, VB) System.Security.Cryptography.RNGCryptoServiceProvider
Ruby SecureRandom
Python os.urandom
Perl Math::Random::Secure
C/C++ (Windows API) CryptGenRandom
Any language on GNU/Linux or Unix Read from /dev/random or /dev/urandom

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *