Go语言 如何验证密码

zbdgwd5y  于 2023-06-03  发布在  Go
关注(0)|答案(1)|浏览(280)

在这段代码中,第一个函数是Findaccount(),它将查找数据库中的电子邮件地址和以散列形式存在的密码。所以CompareHashAndPassword()比较哈希和密码。
现在,在handler.go文件中,我有一个名为loginData()的函数,它将允许用户登录。我有个问题我调用了database.Findaccount(email, password, hash)函数,但它只是验证一个电子邮件地址,并没有验证正确的密码,并给予我false消息。
但是如果我像这样调用函数database.Findaccount(email, "1234", hash),它会验证电子邮件和密码。
如何解决这个问题,因为我将无法记住每个密码。

db.go

  1. func Findaccount(myEmail, myPassword, hash string) bool {
  2. collection := Connect.Database("WebApp2").Collection("dataStored")
  3. if err := collection.FindOne(context.TODO(), bson.M{"email": myEmail}).Decode(&Account); err != nil {
  4. fmt.Println("Enter the correct email or password")
  5. }
  6. err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(myPassword))
  7. return err == nil
  8. }

handler.go

  1. func HashPassword(password string) (string, error) {
  2. bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
  3. return string(bytes), err
  4. }
  5. func loginData(w http.ResponseWriter, r *http.Request) {
  6. email := r.FormValue("email")
  7. password := r.FormValue("password")
  8. hash, _ := HashPassword(password)
  9. match := database.Findaccount(email, password, hash) // here is a problem
  10. if match == false {
  11. fmt.Println("false")
  12. } else {
  13. fmt.Println("true")
  14. }
  15. }
g6baxovj

g6baxovj1#

根据文档,这是bycrypt.CompareHashAndPassword()的func模式:

  1. func CompareHashAndPassword(hashedPassword, password []byte) error

要使用它,您需要将hashedPassword(存储在数据库中的散列密码)作为函数调用的第一个参数。
然后从request param中取password作为第二个参数的值。

  1. func loginData(w http.ResponseWriter, r *http.Request) {
  2. email := r.FormValue("email")
  3. password := r.FormValue("password")
  4. match := database.Findaccount(email, password)
  5. if match == false {
  6. fmt.Println("false")
  7. } else {
  8. fmt.Println("true")
  9. }
  10. }
  11. func Findaccount(myEmail, myPassword string) bool {
  12. collection := Connect.Database("WebApp2").Collection("dataStored")
  13. if err := collection.FindOne(context.TODO(), bson.M{"email": myEmail}).Decode(&Account); err != nil {
  14. fmt.Println("Enter the correct email or password")
  15. }
  16. err := bcrypt.CompareHashAndPassword([]byte(Account.Password), []byte(myPassword))
  17. return err == nil
  18. }

Findaccount()上,语句bcrypt.CompareHashAndPassword()的第一个参数由Account.Password填充,Account.Password是存储在数据库中的散列密码。

展开查看全部

相关问题