首页 > 解决方案 > Bcrypt hashedSecret 太短而不能成为 bcrypted 密码

问题描述

我想使用 Go 创建一个用户身份验证系统,但我一直无法登录帐户。我使用 bcrypt 对密码进行哈希处理,而不是将其保存到数据库(MySQL)中。当我想将它与插入的密码进行比较时,问题就出现了。我有这个错误:hashedSecret too short to be a bcrypted password。我不知道我做错了什么。这是我的代码:

models.go

type User struct {
    ID       string `json:"id"`
    Username string `json:"username"`
    Password string `json:"password"`
    IsAdmin  bool   `json:"is_admin"`
}

user-routes.go (login func)

err := db.QueryRow("SELECT Password FROM Users WHERE Username = ?", user.Username).Scan(&storedPass)
    if err != nil {
        log.Fatal(err)
    }
    // hashed password
    fmt.Println(storedPass, []byte(storedPass))
    err = bcrypt.CompareHashAndPassword([]byte(storedPass), []byte(user.Password))
    if err != nil {
        // Here is error
        fmt.Println(err.Error())
    }

user-routes.go (register func)

stmt, err := db.Prepare(`INSERT INTO Users(Username, Password, IsAdmin) VALUES (?, ?, 0)`)
    if err != nil {
        log.Fatal(err)
    }
hash, _ := bcrypt.GenerateFromPassword([]byte(user.Password), 10)
res, err := stmt.Exec(user.Username, string(hash))

看起来错误是当我将散列密码与插入的密码进行比较时。另外,我将密码保存到数据库中,没有任何错误。

+----+----------+----------------------------------------------------+---------+
| ID | Username | Password                                           | IsAdmin |
+----+----------+----------------------------------------------------+---------+
| 38 | test2    | $2a$10$5WwRQahtjgmaeIKRGXGZNOLVAv5EXUidRwbnZeryq9e |       0 |
+----+----------+----------------------------------------------------+---------+

标签: gobcrypt

解决方案


bcrypt产生 59-60 字节的散列(有关详细信息,请参阅此答案)。为了将哈希存储为varchar,您需要确保其大小足够。根据您的评论,您使用varchar(50),这还不够,这就是更改其大小解决了您的问题的原因。


推荐阅读