0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GoでBcryptを使用するときのメモ

Posted at

GoでBcryptを使用するときのメモ

パスワード保存にargon2が推奨1されている現在でもBcryptを使うときようのメモ。

Bcryptは72バイト文字より長い入力を切り捨てる2ため、それ以上の入力を考慮するのであればハッシュ関数(例えば出力長が64バイトのSHA-512)を用いるなどして入力長が72バイト以下に収まるように処理しなくてはならない。一部の実装ではヌルバイト文字を終端文字として認識してしまう問題があるが、golang.org/x/cryptoの実装ではそのような問題がない3ので、単にSHA-512でハッシュ値を取ってBcryptの入力にすればよい。

func computeSHA512(data []byte) []byte {
	r := sha512.Sum512([]byte(data))
	return r[:]
}

func GeneratePasswordHash(password []byte) ([]byte, error) {
	p := computeSHA512(password)
	return bcrypt.GenerateFromPassword(p, bcrypt.DefaultCost)
}

func VerifyPassword(hashedPassword, password []byte) bool {
	p := computeSHA512(password)
	return bcrypt.CompareHashAndPassword(hashedPassword, p) == nil
}
  1. https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html

  2. golang.org/x/cryptoではエラーになる

  3. 最終的にコミットには含まれていないが、過去にこの動作についてドキュメント化されようとしていたようである->https://go.dev/cl/516916

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?