Bcrypt hashedSecret слишком короткий, чтобы быть зашифрованным паролем - PullRequest
0 голосов
/ 24 июня 2018

Я хочу создать систему аутентификации пользователя, используя 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 |
+----+----------+----------------------------------------------------+---------+

1 Ответ

0 голосов
/ 24 июня 2018

bcrypt создает хэши 59-60 байт (подробности см. в этом ответе ). Чтобы сохранить хэш как varchar, необходимо убедиться, что его размер достаточен. Согласно вашему комментарию , вы используете varchar(50), что недостаточно, и именно поэтому изменение его размера решило вашу проблему.

...