40 lines
725 B
Go
40 lines
725 B
Go
|
package bcrypt
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"golang.org/x/crypto/bcrypt"
|
||
|
)
|
||
|
|
||
|
var _ Password = (*password)(nil)
|
||
|
|
||
|
type Password interface {
|
||
|
i()
|
||
|
Generate(pwd string) string
|
||
|
Validate(pwd, hash string) bool
|
||
|
}
|
||
|
|
||
|
type password struct {
|
||
|
cost int
|
||
|
}
|
||
|
|
||
|
func (p *password) i() {}
|
||
|
|
||
|
func NewPassword(cost int) (Password, error) {
|
||
|
if cost < bcrypt.MinCost || cost > bcrypt.MaxCost {
|
||
|
return nil, fmt.Errorf("cost out of range")
|
||
|
}
|
||
|
return &password{
|
||
|
cost: cost,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func (p *password) Generate(pwd string) string {
|
||
|
hash, _ := bcrypt.GenerateFromPassword([]byte(pwd), p.cost)
|
||
|
return string(hash)
|
||
|
}
|
||
|
|
||
|
func (p *password) Validate(pwd, hash string) bool {
|
||
|
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(pwd))
|
||
|
return err == nil
|
||
|
}
|