golang-template/internal/auth/password.go
2026-08-15 23:57:52 +03:00

41 lines
959 B
Go

package auth
import (
"crypto/subtle"
"encoding/base64"
"fmt"
"strings"
"golang.org/x/crypto/argon2"
)
func VerifyPassword(hashedPassword, password string) bool {
// Parse the Argon2 hash format: $argon2id$v=19$m=65536,t=3,p=4$salt$hash
parts := strings.Split(hashedPassword, "$")
if len(parts) != 6 {
return false
}
// Extract parameters
var memory, time, threads uint32
var version int
fmt.Sscanf(parts[2], "v=%d", &version)
fmt.Sscanf(parts[3], "m=%d,t=%d,p=%d", &memory, &time, &threads)
salt, err := base64.RawStdEncoding.DecodeString(parts[4])
if err != nil {
return false
}
hash, err := base64.RawStdEncoding.DecodeString(parts[5])
if err != nil {
return false
}
// Generate hash with the same parameters
derivedKey := argon2.IDKey([]byte(password), salt, time, memory, uint8(threads), uint32(len(hash)))
// Compare hashes using constant time comparison
return subtle.ConstantTimeCompare(hash, derivedKey) == 1
}