TinySkin/utils/argon2id.go
2023-09-03 23:19:38 +08:00

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
}