LoginSignup
4
3

More than 5 years have passed since last update.

Go言語を真剣に勉強してみた〜パスワードのハッシュ化〜

Last updated at Posted at 2019-01-21

はじめに

こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
さて新年一発目の記事はログイン機能を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型を渡す必要があるのでキャストする必要があります。

以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3