package helper import ( "crypto/rand" "encoding/base64" "golang.org/x/crypto/scrypt" ) // Recommended https://pkg.go.dev/golang.org/x/crypto/scrypt const SCRYPT_N = 32768 const SCRYPT_R = 8 const SCRYPT_P = 1 const SCRYPT_L = 64 const SALT_LENGTH = SCRYPT_L func getEncoding() *base64.Encoding { return base64.StdEncoding.WithPadding(base64.NoPadding) } // Generates truly random bytes. func generateRandomBytes(len int) ([]byte, error) { salt := make([]byte, len) _, err := rand.Read(salt) if err != nil { return nil, err } return salt, nil } func GenerateSalt() (string, error) { salt, err := generateRandomBytes(SALT_LENGTH) if err != nil { return "", err } return getEncoding().EncodeToString(salt), nil } func GenerateHash(password string, salt string) (string, error) { hash, err := scrypt.Key([]byte(password), []byte(salt), SCRYPT_N, SCRYPT_R, SCRYPT_P, SCRYPT_L) if err != nil { return "", err } return getEncoding().EncodeToString(hash), nil }