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