From 910b60f3c41c47b8c80c36093f7016f5880227ba Mon Sep 17 00:00:00 2001 From: Juliusz Chroboczek Date: Mon, 20 Jan 2025 16:47:49 +0100 Subject: [PATCH] Change default password hashing algorithm to bcrypt. Now that we limit the number of concurrent password hashing operations, it is safe to use an algorithm that uses a fait amount of memory. We use strength 8, which is below the recommended default, in order to keep password hashing time below 25ms. --- galenectl/galenectl.go | 5 ++--- webserver/api.go | 19 ++++++------------- webserver/api_test.go | 2 +- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/galenectl/galenectl.go b/galenectl/galenectl.go index 2d64131..b6f35e0 100644 --- a/galenectl/galenectl.go +++ b/galenectl/galenectl.go @@ -280,12 +280,11 @@ func hashPasswordCmd(cmdname string, args []string) { os.Args[0], cmdname, ) cmd.StringVar(&password, "password", "", "new `password`") - cmd.StringVar(&algorithm, "type", "pbkdf2", + cmd.StringVar(&algorithm, "type", "bcrypt", "password `type`") cmd.IntVar(&iterations, "iterations", 4096, "`number` of iterations (pbkdf2)") - cmd.IntVar(&cost, "cost", bcrypt.DefaultCost, - "`cost` (bcrypt)") + cmd.IntVar(&cost, "cost", 8, "`cost` (bcrypt)") cmd.IntVar(&length, "key", 32, "key `length` (pbkdf2)") cmd.IntVar(&saltlen, "salt", 8, "salt `length` (pbkdf2)") cmd.Parse(args) diff --git a/webserver/api.go b/webserver/api.go index 186d94d..36739af 100644 --- a/webserver/api.go +++ b/webserver/api.go @@ -2,9 +2,7 @@ package webserver import ( "crypto/rand" - "crypto/sha256" "encoding/base64" - "encoding/hex" "encoding/json" "errors" "io" @@ -13,7 +11,7 @@ import ( "os" "strings" - "golang.org/x/crypto/pbkdf2" + "golang.org/x/crypto/bcrypt" "github.com/jech/galene/group" "github.com/jech/galene/stats" @@ -407,21 +405,16 @@ func passwordHandler(w http.ResponseWriter, r *http.Request, g, user string, wil if done { return } - salt := make([]byte, 8) - _, err := rand.Read(salt) + key, err := bcrypt.GenerateFromPassword(body, 8) if err != nil { httpError(w, err) return } - iterations := 4096 - key := pbkdf2.Key(body, salt, iterations, 32, sha256.New) - encoded := hex.EncodeToString(key) + + k := string(key) pw := group.Password{ - Type: "pbkdf2", - Hash: "sha-256", - Key: &encoded, - Salt: hex.EncodeToString(salt), - Iterations: iterations, + Type: "bcrypt", + Key: &k, } err = group.SetUserPassword(g, user, wildcard, pw) if err != nil { diff --git a/webserver/api_test.go b/webserver/api_test.go index 8bc6616..4cc9cbf 100644 --- a/webserver/api_test.go +++ b/webserver/api_test.go @@ -241,7 +241,7 @@ func TestApi(t *testing.T) { t.Errorf("Users: %#v", desc.Users) } - if desc.Users["jch"].Password.Type != "pbkdf2" { + if desc.Users["jch"].Password.Type != "bcrypt" { t.Errorf("Password.Type: %v", desc.Users["jch"].Password.Type) }