はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。
さて新年一発目の記事はログイン機能をgolangで実装するときのパスワードのハッシュ化の方法を紹介していきます。
準備
golang.org/x/crypto/bcrypt
を使用することで安全なパスワードハッシュとチェックができます。
まず$GOPATHに移動して以下のコマンドを叩いてください。
terminal
go get golang.org/x/crypto/bcrypt
DBなどに登録するパスワードのハッシュ化
import "golang.org/x/crypto/bcrypt"
func main() {
hash, err := passwordHash("登録用パスワード")
if err != nil {
panic(err)
}
println(hash)
}
// パスワードハッシュを作る関数
func passwordHash(pw string) (string, error) {
hash, err := bcrypt.GenerateFromPassword([]byte(pw), bcrypt.DefaultCost)
if err != nil {
return "", err
}
return string(hash), err
}
GenerateFromPassword
は[]byte型を渡す必要があるのでフォームなどから入力されたパスワードを[]byte型にキャストする必要があります。
戻り値も[]byte型なのでDBに保存する時などにstring型にキャストします。
登録したパスワードハッシュが入力パスワードにマッチするかどうかを調べる
import "golang.org/x/crypto/bcrypt"
func main() {
// hashはDBなどからとってくる
err := passwordVerify(hash, "入力されたパスワード")
if err != nil {
panic(err)
}
println("認証しました")
}
// 登録したパスワードハッシュが入力パスワードにマッチするかどうかを調べる関数
func passwordVerify(hash, pw string) error {
return bcrypt.CompareHashAndPassword([]byte(hash), []byte(pw))
}
CompareHashAndPassword
も[]byte型を渡す必要があるのでキャストする必要があります。
以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。