31 lines
689 B
Go
31 lines
689 B
Go
package password
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
const prefix = "bcrypt:v1:"
|
|
|
|
var ErrInvalidEncoding = errors.New("password hash encoding is invalid")
|
|
|
|
func Encode(value string) (string, error) {
|
|
if len(value) < 12 || len(value) > 1024 {
|
|
return "", ErrInvalidEncoding
|
|
}
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(value), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return prefix + string(hash), nil
|
|
}
|
|
|
|
func Verify(encoded, value string) bool {
|
|
if !strings.HasPrefix(encoded, prefix) || len(value) > 1024 {
|
|
return false
|
|
}
|
|
return bcrypt.CompareHashAndPassword([]byte(strings.TrimPrefix(encoded, prefix)), []byte(value)) == nil
|
|
}
|