Bcrypt哈希密钥太短,无法成为Bcrypt密码。

3

我希望使用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"`
}

用户路由.go (登录函数)

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 |
+----+----------+----------------------------------------------------+---------+

2
你的数据库中密码列是什么类型和长度? - tkausl
这是 varchar(50) - xaos_xv
3
太短了。 - tkausl
@tkausl 谢谢。我改变了列的长度,现在一切都正常! - xaos_xv
1个回答

8
bcrypt生成的哈希值通常为59-60个字节(详见这篇回答)。如果要将哈希值存储为varchar类型,则需要确保其大小足够。根据您在评论中提到的,您使用的是varchar(50),这是不够的。这也是更改大小后问题得以解决的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接