jeudi 11 septembre 2008

Un peu de sel dans les passwords

Il a suffi d'un regard vers ma table de passwords pour me rendre compte du problème: tous mes passwords de test avaient le même hash. Normal, les passwords sont identiques...

Se contenter de hacher les mots de passes avec du md5 les rend particulièrement vulnérables à une attaque de type dictionnaire, où l'attaquant génère des hashs de mots connus et les compare à toutes les entrées dans la table. L'augmentation du nombre d'entrées augmente du même coup la probabilité de faire mouche.

La méthode standard pour renforcer le hachage est d'introduire un "salt", petit mot aléatoire au début du mot de passe. Je me suis donc attelé à la tâche, et voilà les deux fonctions pour Postgres qui génèrent et vérifient les mots de passe.


-- createPassword (login, password)
create function createPassword(varchar(255), varchar(255)) returns varchar(255) as
$$
select salt.s || md5(salt.s || $1 || $2) from
(select substr(md5(now()::text), 0, 5) as s) as salt
$$ language 'sql' volatile;

-- matchPassword (login, password, hash)
create function matchPassword(varchar(255), varchar(255), varchar(255)) returns boolean as
$$
select (salt.s || md5(salt.s || $1 || $2)) = $3 from
(select substr($3, 0, 5) as s) as salt;
$$ language 'sql' immutable;


Disclaimeur: Si vous faites quoi que ce soit de sérieux avec ces fonctions, prenez conseil auprès d'un pro de la cryptographie. Notamment, je suis sûr que générer le salt à partir d'un hash de l'horloge sera considéré comme une faiblesse

Aucun commentaire: