前提・実現したいこと
Goでログイン認証するAPIを作ろうとしています。
MySQLではbcryptでハッシュ化したパスワードを格納しています。型はCHAR(65)です。
GinでPostFormしたパスワードと、MySQLに格納されたパスワードをbcryptのCompareHashAndPassword比較し、一致したら認証成功、というようにしたいです。
発生している問題・エラーメッセージ
保存した値と同じ値を入力していても一致しません。
以下のメッセージが確認されます。
crypto/bcrypt: hashedPassword is not the hash of the given password
以下のコードの中でどこに問題があるのでしょうか。
該当のソースコード
Go
1var userauth model.User 2inputuser := c.PostForm("user") 3inputpass := c.PostForm("password") 4 5gormdb.Select("pass").Where("name = ?", inputuser).Find(&userauth) 6selectpass := userauth.Pass 7 8err := bcrypt.CompareHashAndPassword(selectpass, []byte(inputpass)) //ここでエラー発生
なお、MySQLに格納する関数は以下の通りです。
model.UserのPassの型は[]byteです。
※格納時にはエラーはなく、MySQLに格納されたことも確認済みです。
Go
1func signUp(id string, user string, mailaddress string, pass string) (err error) { 2 3 sqldb, gormdb := infra.DBConnect() 4 defer sqldb.Close() 5 6 newid, _ := stc.Atoi(id) 7 8 hash, err := bcrypt.GenerateFromPassword([]byte(pass), bcrypt.DefaultCost) 9 10 if err != nil { 11 return err 12 } 13 14 newuser := model.User{ 15 ID: newid, 16 Name: user, 17 MailAddress: mailaddress, 18 Pass: hash, 19 CreatedAt: time.Now(), 20 UpdatedAt: time.Now(), 21 } 22 23 err = gormdb.Create(&newuser).Error 24 25 if err != nil { 26 return err 27 } 28 29 return nil 30}
試したこと
格納時のhashの型をreflectで調べてみたところ、[]uint8になっていました(何故?)
試しに[]byteのところを全て[]uint8にしてみたのですが、結果は同じでした。
ユーザ名とパスワードを変えてやってみたのですが、結果は同じでした。
補足情報(FW/ツールのバージョンなど)
MySQL: Ver8.0.22
Go: 1.14.6
MacOS Catalina Ver.10.15.6
Gorm: v2
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/13 03:51
2020/11/13 05:33
2020/11/13 05:56