33 lines
729 B
Go
33 lines
729 B
Go
package utils
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"crypto/subtle"
|
|
"encoding/base64"
|
|
|
|
"golang.org/x/crypto/argon2"
|
|
)
|
|
|
|
func Argon2ID(pass string) (password string, salt string) {
|
|
s := make([]byte, 16)
|
|
_, err := rand.Read(s)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
b := argon2.IDKey([]byte(pass), s, 1, 64*1024, 1, 32)
|
|
return base64.StdEncoding.EncodeToString(b), base64.StdEncoding.EncodeToString(s)
|
|
}
|
|
|
|
func Argon2Compare(pass, hashPass string, salt string) bool {
|
|
s, err := base64.StdEncoding.DecodeString(salt)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
b := argon2.IDKey([]byte(pass), s, 1, 64*1024, 1, 32)
|
|
hb, err := base64.StdEncoding.DecodeString(hashPass)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return subtle.ConstantTimeCompare(b, hb) == 1
|
|
}
|