Sauvegarder les mots de passe dans Postgresql avec bcrypt

On voit de plus en plus souvent dans les news, que des bases de données se sont faites hackées, et des gros dumps de mots de passe circulent ainsi dans la nature.

La sauvegarde old school

La manière classique de sauvegarder les mots de passe utilisateur est de les garder en clair de les hasher (md5, sha1, …) avec un salt.

Exemple:

Voila, on récupère ainsi une chaine de caractère illisible. Le problème c’est qu’elle est crackable très très rapidement, puisque les algorithmes de hash rapides, tels que md5 et ceux de la famille SHA, ne sont plus vraiment fiables: voir cet article.

Et oui décrypter un hash en quelques secondes avec les technologies d’aujourd’hui est clairement possible.

La nouvelle façon

Maintenant il existe une approche plus moderne pour faire tout ça avec Postgresql: bcrypt qui fait partie du module pgcrypto.

Attention, si vous avez déjà une application avec des utilisateurs, ils seront obligés de mettre à jour leur mot de passe pour cette nouvelle solution.

Avantages de bcrypt

  • On utilise un algorithme de hash lent (Blowfish)
  • Plusieurs cycles de hash sont exécutés afin de renforcer la sécurité
  • Un salt aléatoire est généré pour chaque mot de passe. Inutile de garder un salt dans son code/BDD et la sécurité est plus accrue.

Mise en place

Modification du type du champ mot de passe (facultatif):

Ajout du module à votre base:

Mise à jour d’un mot de passe pour un utilisateur donné:

Dans la génération du salt, bf correspond à l’algorithme (blowfish) et le chiffre 8 correspond au nombre de passage. Plus le nombre de passage est élevé, plus c’est long et plus c’est sécurisé. Sur la doc de pgcrypto il est conseillé d’avoir une vitesse d’exécution entre 4 et 100 mots de passe par seconde. La vitesse change évidemment suivant la puissance du processeur. Un tableau est aussi disponible, toujours sur la doc afin de comparer les temps d’exécution suivant les différents types d’algorithme avec un même processeur.

Comparer le mot de passe entré par l’utilisateur à celui en base:

Ici le mot de passe en base est utilisé comme salt du mot de passe entré.

Et voila, il n’y a rien de bien compliqué, c’est facile à mettre en place, donc sautez sur l’occasion pour améliorer la sécurité de votre application.

5 thoughts on “Sauvegarder les mots de passe dans Postgresql avec bcrypt

  1. Bonjour Maxime!
    ton tutoriel est très intéressant.

    Je suis en train de réaliser une application avec le Framework codeigniter, ma BD est ss postgressql. j’utilise la fonction crypt() avec gen_salt() pour m’insertion des mot de passe en BD, mais j’ai une erreur qui dit ceci:

     » Fatal error: Call to undefined function gen_salt() in C:\wamp\www\CodeIgniter-2.2.3D\application\models\insert_model.php on line 10″

    Si tas une idée, je suis preneur Merci

    • Salut,
      Ca ressemble à une erreur PHP. gen_salt() est une fonction PostGreSQL. Vérifie bien que la fonction fasse partie de ta requête, et ne soit pas comprise comme du PHP.

      • salut!
        Merci pour l’élément de réponse!

        toutefois, je me pose une question: Est-ce que ce mot de passe ne sera pas visible en clair sur le réseau pendant son cheminement entre le client et le serveur?

        • Si tu utilises HTTP si. Avec HTTPS il n’y a aucun problème.
          Pour HTTP tu peux créer un hash + salt du mot de passe en te connectant avec une requête Ajax. Personnellement je ne trouve pas que cette dernière solution soit tellement sécurisée mais elle l’est un peu plus que l’envoi des informations en clair. Si tu veux vraiment sécuriser le transfert je te conseille d’utiliser https.

Laisser un commentaire