如何验证密码
在此代码中,第一个函数Findaccount()将在数据库中查找电子邮件地址和以哈希形式存在的密码。所以CompareHashAndPassword()比较哈希和密码。
现在在handler.go文件中,我调用loginData()了一个允许用户登录的函数。我在这里遇到了问题。我调用了database.Findaccount(email, password, hash)函数,但它只是验证电子邮件地址,不验证
正确的密码,并给我false消息。
但是如果我这样调用函数database.Findaccount(email, "1234", hash),它会同时验证电子邮件和密码。
如何解决这个问题,因为我将无法记住每个密码。
数据库
func Findaccount(myEmail, myPassword, hash string) bool {
collection := Connect.Database("WebApp2").Collection("dataStored")
if err := collection.FindOne(context.TODO(), bson.M{"email": myEmail}).Decode(&Account); err != nil {
fmt.Println("Enter the correct email or password")
}
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(myPassword))
return err == nil
}
处理程序
func HashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
func loginData(w http.ResponseWriter, r *http.Request) {
email := r.FormValue("email")
password := r.FormValue("password")
hash, _ := HashPassword(password)
match := database.Findaccount(email, password, hash) // here is a problem
if match == false {
fmt.Println("false")
} else {
fmt.Println("true")
}
}
回答
根据文档,这是 func 架构bycrypt.CompareHashAndPassword():
func CompareHashAndPassword(hashedPassword, password []byte) error
要使用它,您需要将hashedPassword(这是存储在数据库中的散列密码)作为第一个参数值。
然后将passwordfrom 请求参数放到第二个参数中。
func loginData(w http.ResponseWriter, r *http.Request) {
email := r.FormValue("email")
password := r.FormValue("password")
match := database.Findaccount(email, password)
if match == false {
fmt.Println("false")
} else {
fmt.Println("true")
}
}
func Findaccount(myEmail, myPassword string) bool {
collection := Connect.Database("WebApp2").Collection("dataStored")
if err := collection.FindOne(context.TODO(), bson.M{"email": myEmail}).Decode(&Account); err != nil {
fmt.Println("Enter the correct email or password")
}
err := bcrypt.CompareHashAndPassword([]byte(Account.Password), []byte(myPassword))
return err == nil
}
参见Findaccount(),语句的第一个参数bcrypt.CompareHashAndPassword()由Account.Password存储在数据库中的散列密码填充。
- @mh-cbon bcrypt 自动包含盐
- 一点盐适合那个食谱,不是吗?