[Go] Passwort-Hash erstellen mit Bcrypt

Datum

bcrypt ist eine kryptologische Hashfunktion, die speziell für das Hashen und Speichern von Passwörtern entwickelt wurde. Die auf dem Blowfish-Algorithmus basierende Funktion wurde von Niels Provos und David Mazières konzipiert und auf der USENIX-Konferenz im Jahre 1999 der Öffentlichkeit präsentiert.

Eine recht praktische Sache ist das Hashen eines Strings mit Go.
Die Einzelheiten zum Packet bcrypt und den einzelnen Funktionen findet man auf godoc.org
Weitere Einzelheiten zu bcrypt findet man hier: bcrypt.sourceforge.net

Ein Bcrypt-Hash sieht z.B. so aus:
36 50 97 36 49 48 36 69 68 119 54 55 106 51 65 81 67 67 105 80 49 104 116 108 47 105 78 104 101 52 69 47 81 88 89 69 65 87 100 89 67 52 90 71 116 85 74 107 85 49 65 119 55 110 115 107 57 107 51 67

Hier mal ein Code-Beispiel zum hashen eines Strings:


package main

import (
	"fmt"

	"golang.org/x/crypto/bcrypt"
)

func main() {
	s := "passwort123"
	bs, err := bcrypt.GenerateFromPassword([]byte(s), bcrypt.DefaultCost)
	if err != nil { // Error-Handling
		fmt.Println(err)
	}
	fmt.Println("Klartext:", s)     // gibt noch einmal den zu hash-enden String aus
	fmt.Println("Bcrypt-Hash:", bs) // gibt den String in ge-hash-ter Form aus

	// Vergleich zwischen ge-hash-ten und unge-hash-ten Strings:

	testpasswd := "passwort123"
	testhash := []byte{36, 50, 97, 36, 49, 48, 36, 71, 50, 111, 105, 120, 84, 79, 52, 71, 50, 54, 102, 104, 87, 117, 105, 49, 114, 75, 85, 65, 117, 98, 118, 71, 109, 114, 48, 53, 87, 82, 78, 66, 84, 57, 80, 82, 67, 74, 82, 54, 67, 113, 68, 82, 102, 71, 111, 104, 106, 75, 82, 87}
	err = bcrypt.CompareHashAndPassword(testhash, []byte(testpasswd))
	if err != nil { // Wenn es nicht das richtige Passwort war
		fmt.Println("Falsches Passwort!")
		return
	}
	fmt.Println("Richtiges Passwort!")

	// Cost-Parameter ermitteln
	/* 	Anmerkung:
		*	Neuere Passwort-Hashing-Funktionen haben einen Cost-Paramter.append
		*	Dieser gibt an, wieviel "Arbeit" (z.B. CPU-Zeit) aufgewendet wurde um diesen Hash zu erstellen
		*	Definition:
		*	MinCost     int = 4  // the minimum allowable cost as passed in to GenerateFromPassword
	    *	MaxCost     int = 31 // the maximum allowable cost as passed in to GenerateFromPassword
	    *	DefaultCost int = 10 // the cost that will actually be set if a cost below MinCost is passed into GenerateFromPassword
	*/
	c, err := bcrypt.Cost(testhash)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("Cost:", c)

}

Eine Beispielausgabe sieht wie folgt aus:


$ go run bcrypt.go
Klartext: passwort123
Bcrypt-Hash: [36 50 97 36 49 48 36 103 89 55 88 89 99 53 113 97 49 51 83 120 111 74 84 108 72 106 85 48 101 102 110 46 77 122 112 49 47 105 70 51 66 109 48 106 80 87 54 103 57 112 77 74 47 77 79 77 116 106 66 105]
Richtiges Passwort!
Cost: 10

Quellcode von bcrypt.go auf Github.com: bcrypt.go

Kleine Anmerkung: Bcrypt wird auch explizit von diversen erfahrenen Developern zum Hashen von Passwörtern empfohlen.
Z.B.: GopherCon 2016: George Tankersley – Go for Crypto Developers

Autor
Kategorien Coding, Go

PRTG Map