go で暗号化:bcrypt でパスワードのハッシュ化と検証

はじめに

go の暗号化処理についてまとめます。
今回は golang.org/x/crypto/bcrypt でパスワードのハッシュ化と検証を行います。

golang.org/x/crypto/bcrypt

golang.org/x/crypto/bcrypt は高級なインターフェースを備えているので短く書けます。
CompareHashAndPassword は73文字目以降は無視されてしまうようなのでバリデーションを入れたほうが良さそうです。

package main

import (
    "fmt"
    "golang.org/x/crypto/bcrypt"
)

// ハッシュ化
func hash(s string) (string, error) {
    hash, err := bcrypt.GenerateFromPassword([]byte(s), bcrypt.DefaultCost)
    if err != nil {
        return "", err
    }
    return string(hash), err
}

// 検証
func verify(hash, s string) error {
    return bcrypt.CompareHashAndPassword([]byte(hash), []byte(s))
}

func main() {
    hash, err := hash("password123")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("hash: ", hash)

    // TODO: check password length less than 72
    err = verify(hash, "password123") // valid case
    // err = verify(hash, "password1234") // invalid case
    if err != nil {
        fmt.Println("err: ", err)
    } else {
        fmt.Println("ok!")
    }
}

まとめ

bcrypt でパスワードのハッシュ化と検証の方法をまとめました。