bcrypt pour Go : guide complet pour le hachage de mots de passe
La sécurité des données utilisateur est l'un des enjeux majeurs du développement web moderne. Stocker des mots de passe en clair est inacceptable, et un simple hachage via MD5 ou SHA-1 est depuis longtemps considéré comme non sécurisé en raison de sa vulnérabilité aux attaques par force brute. La bibliothèque bcrypt pour Go offre un algorithme de hachage adaptatif fiable et éprouvé, résistant à la fois aux attaques par dictionnaire et aux attaques par tables arc-en-ciel.
L'algorithme bcrypt a été conçu en 1999 par Niels Provos et David Mazières, basé sur le chiffrement Blowfish. Sa caractéristique clé est la complexité adaptative : vous pouvez augmenter le nombre d'itérations de hachage, rendant le cassage des mots de passe de plus en plus coûteux à mesure que la puissance de calcul augmente. Dans l'écosystème Go, la bibliothèque standard golang.org/x/crypto/bcrypt est une extension officielle maintenue par l'équipe de développement de Go.
Dans cet article, nous allons détailler tous les aspects de l'utilisation de bcrypt en Go : de l'installation et de l'utilisation de base aux techniques avancées et aux erreurs courantes. Vous apprendrez à hacher correctement les mots de passe, à les comparer avec des hachages, à choisir le coût optimal (cost) et à intégrer bcrypt dans des applications réelles.
Installation
La bibliothèque bcrypt pour Go ne fait pas partie de la bibliothèque standard, mais elle est incluse dans le sous-module officiel x/crypto. L'installation se fait en une seule commande :
go get golang.org/x/crypto/bcrypt
Après avoir exécuté cette commande, une dépendance apparaîtra dans votre fichier go.mod et vous pourrez importer le package dans votre code :
import "golang.org/x/crypto/bcrypt"
Assurez-vous d'avoir installé Go version 1.13 ou supérieure (1.21+ est recommandé). Si vous utilisez les modules (ce qui est la norme en 2024), la dépendance sera téléchargée automatiquement.
Démarrage rapide : exemple minimal fonctionnel
Commençons par l'exemple le plus simple : le hachage d'un mot de passe et sa vérification. C'est la base que vous utiliserez dans tous vos projets.
package main
import (
"fmt"
"log"
"golang.org/x/crypto/bcrypt"
)
func main() {
// Mot de passe utilisateur d'origine
password := []byte("mySecretPassword123!")
// Hachage du mot de passe avec le coût par défaut (10)
hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Hachage du mot de passe : %s\n", hashedPassword)
// Vérification avec le bon mot de passe
err = bcrypt.CompareHashAndPassword(hashedPassword, password)
if err != nil {
fmt.Println("Le mot de passe ne correspond pas !")
} else {
fmt.Println("✓ Le mot de passe correspond !")
}
// Vérification avec un mauvais mot de passe
wrongPassword := []byte("wrongPassword")
err = bcrypt.CompareHashAndPassword(hashedPassword, wrongPassword)
if err != nil {
fmt.Println("✗ Le mot de passe ne correspond pas (comme prévu)")
}
}
Ce code fait trois choses : il génère un hachage, vérifie un mot de passe correct et s'assure qu'un mot de passe incorrect est rejeté. Notez que GenerateFromPassword génère automatiquement un sel aléatoire et l'intègre dans le hachage, donc vous obtiendrez des hachages différents à chaque fois pour le même mot de passe.
Méthodes et fonctions principales
Le package bcrypt fournit une API petite mais très bien conçue. Examinons toutes les fonctions principales avec des exemples.
1. GenerateFromPassword
Signature : func GenerateFromPassword(password []byte, cost int) ([]byte, error)
Description : Fonction principale pour hacher un mot de passe. Elle prend le mot de passe sous forme de slice d'octets et le coût (cost) — un indicateur logarithmique du nombre d'itérations. Elle retourne le hachage au format bcrypt standard (contenant le sel, le coût
Aussi dans la bibliothèque
Configuration des applications Node.js : meilleures bibliothèques et pratiques
Utilisation de GraphQL en Swift : bibliothèques Apollo et Relay pour iOS/macOS
OpenAPI / Swagger Java : guide complet avec exemples
Travailler avec les jetons JWT en TypeScript : bibliothèque jsonwebtoken et guide complet