package htpasswd import ( "bytes" "crypto/sha1" "encoding/base64" "fmt" ) // Sha facilitates sha1 style hashing type Sha struct{} // Hash returns the hashed variant of the password or an error func (ss *Sha) Hash(passwd string) (string, error) { s := sha1.New() _, err := s.Write([]byte(passwd)) if err != nil { return "", err } passwordSum := []byte(s.Sum(nil)) return ss.Prefix() + base64.StdEncoding.EncodeToString(passwordSum), nil } // Match verifier the hashed password using the original func (*Sha) Match(password, hashedPassword string) error { eppS := hashedPassword[5:] hash, err := base64.StdEncoding.DecodeString(eppS) if err != nil { return fmt.Errorf("cannot base64 decode") } sha := sha1.New() _, err = sha.Write([]byte(password)) if err != nil { return err } sum := sha.Sum(nil) if !bytes.Equal(sum, hash) { return fmt.Errorf("wrong password") } return nil } // Name returns the name of the hasher func (*Sha) Name() string { return "sha" } // Prefix returns the hasher's prefix func (*Sha) Prefix() string { return "{SHA}" }