bcrypt in Go: Die vollständige Anleitung zum Passwort-Hashing
Die Sicherheit von Benutzerdaten ist eine der zentralen Aufgaben der modernen Webentwicklung. Passwörter im Klartext zu speichern ist inakzeptabel, und einfaches Hashing mit MD5 oder SHA-1 gilt aufgrund der Anfälligkeit für Brute-Force-Angriffe längst als unsicher. Die Bibliothek bcrypt für Go bietet einen bewährten und zuverlässigen Algorithmus für adaptives Passwort-Hashing, der sowohl gegen Wörterbuchangriffe als auch gegen Rainbow-Table-Angriffe resistent ist.
Der bcrypt-Algorithmus wurde 1999 von Niels Provos und David Mazières auf Basis der Blowfish-Chiffre entwickelt. Seine entscheidende Eigenschaft ist die adaptive Komplexität: Sie können die Anzahl der Hashing-Iterationen erhöhen, wodurch das Erraten von Passwörtern mit steigender Rechenleistung immer aufwändiger wird. In der Go-Ökosystem ist die Standardbibliothek golang.org/x/crypto/bcrypt die offizielle Erweiterung und wird vom Go-Entwicklerteam unterstützt.
In diesem Artikel gehen wir detailliert auf alle Aspekte der Arbeit mit bcrypt in Go ein: von der Installation und grundlegenden Nutzung bis hin zu fortgeschrittenen Techniken und typischen Fehlern. Sie erfahren, wie Sie Passwörter korrekt hashen, mit Hashes vergleichen, die optimale Kostenstufe (Cost) wählen und bcrypt in reale Anwendungen integrieren.
Installation
Die bcrypt-Bibliothek für Go ist nicht Teil der Standardbibliothek, aber ein Bestandteil des offiziellen Untermoduls x/crypto. Die Installation erfolgt mit einem einzigen Befehl:
go get golang.org/x/crypto/bcrypt
Nach Ausführung dieses Befehls erscheint die Abhängigkeit in Ihrer go.mod-Datei, und Sie können das Paket in Ihren Code importieren:
import "golang.org/x/crypto/bcrypt"
Stellen Sie sicher, dass Sie Go Version 1.13 oder höher installiert haben (empfohlen wird 1.21+). Wenn Sie Module verwenden (was 2024 Standard ist), wird die Abhängigkeit automatisch nachgeladen.
Schnellstart: Minimales Arbeitsbeispiel
Beginnen wir mit dem einfachsten Beispiel: Passwort-Hashing und -Verifikation. Dies ist die Grundlage, die Sie in jedem Projekt verwenden werden.
package main
import (
"fmt"
"log"
"golang.org/x/crypto/bcrypt"
)
func main() {
// Ursprüngliches Benutzerpasswort
password := []byte("mySecretPassword123!")
// Passwort mit Standardkosten (10) hashen
hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Passwort-Hash: %s\n", hashedPassword)
// Korrektes Passwort überprüfen
err = bcrypt.CompareHashAndPassword(hashedPassword, password)
if err != nil {
fmt.Println("Passwort stimmt nicht überein!")
} else {
fmt.Println("✓ Passwort stimmt überein!")
}
// Falsches Passwort überprüfen
wrongPassword := []byte("wrongPassword")
err = bcrypt.CompareHashAndPassword(hashedPassword, wrongPassword)
if err != nil {
fmt.Println("✗ Passwort stimmt nicht überein (wie erwartet)")
}
}
Dieser Code macht drei Dinge: Er generiert einen Hash, überprüft das korrekte Passwort und stellt sicher, dass ein falsches Passwort abgelehnt wird. Beachten Sie: GenerateFromPassword generiert automatisch ein zufälliges Salt und bettet es in den Hash ein, sodass Sie jedes Mal unterschiedliche Hashes für dasselbe Passwort erhalten.
Wichtige Methoden und Funktionen
Das Paket bcrypt bietet eine kleine, aber durchdachte API. Sehen wir uns alle wichtigen Funktionen mit Beispielen an.
1. GenerateFromPassword
Signatur: func GenerateFromPassword(password []byte, cost int) ([]byte, error)
Beschreibung: Die Hauptfunktion zum Hashing von Passwörtern. Sie nimmt das Passwort als Byte-Slice und die Kostenstufe (Cost) entgegen – ein logarithmischer Wert für die Anzahl der Iterationen. Sie gibt den Hash im Standard-bcrypt-Format zurück (enthält Salt und Kosten).
Auch in der Bibliothek
Arbeiten mit CSV in Swift (iOS/macOS) — Bibliotheken und Codebeispiele
Redis-Client für PHP: Predis — Installation, Verbindung, Beispiele
Arbeit mit S3 und Cloud-Speichern in Swift (iOS/macOS): Bibliothek AWSS3