首页 > 解决方案 > 如何验证密码

问题描述

在这段代码中,第一个函数是Findaccount()查找数据库中的电子邮件地址和作为哈希值出现的密码。所以CompareHashAndPassword()比较哈希和密码。

现在在handler.go文件中,我有一个名为的函数loginData(),它允许用户登录。我这里有一个问题。我调用database.Findaccount(email, password, hash)了函数,但它只是验证电子邮件地址而不验证 正确的密码,然后给我false消息。

但是如果我这样调用函数database.Findaccount(email, "1234", hash),它会验证电子邮件和密码。

如何解决这个问题,因为我将无法记住每个密码。

db.go

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
}

处理程序.go

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")
    }
}

标签: gopasswords

解决方案


根据文档,这是 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


推荐阅读