2022-09-30 08:24:54 +00:00
|
|
|
package util
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/base64"
|
2023-12-29 09:56:37 +00:00
|
|
|
"errors"
|
2022-09-30 08:24:54 +00:00
|
|
|
"fmt"
|
2023-12-31 20:46:30 +00:00
|
|
|
|
2022-09-30 08:24:54 +00:00
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
|
|
)
|
|
|
|
|
|
|
|
func HashPassword(plaintext string) (string, error) {
|
|
|
|
bytes, err := bcrypt.GenerateFromPassword([]byte(plaintext), 14)
|
|
|
|
if err != nil {
|
|
|
|
return "", fmt.Errorf("cannot hash password: %w", err)
|
|
|
|
}
|
|
|
|
return base64.StdEncoding.EncodeToString(bytes), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func VerifyHash(base64Hash string, plaintext string) (bool, error) {
|
|
|
|
hash, err := base64.StdEncoding.DecodeString(base64Hash)
|
|
|
|
if err != nil {
|
|
|
|
return false, fmt.Errorf("cannot decode base64 hash: %w", err)
|
|
|
|
}
|
|
|
|
err = bcrypt.CompareHashAndPassword(hash, []byte(plaintext))
|
2023-12-29 09:56:37 +00:00
|
|
|
if errors.Is(err, bcrypt.ErrMismatchedHashAndPassword) {
|
2022-09-30 08:24:54 +00:00
|
|
|
return false, nil
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
return false, fmt.Errorf("cannot verify password: %w", err)
|
|
|
|
}
|
|
|
|
return true, nil
|
|
|
|
}
|