技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

パスワード用ハッシュ、jBCrypt を使ってみた

なんでそんなことになったかというと、Playframework の Crypto クラスがいつの間にか Deplicate になってたという事態。
これにより、色々変動があったのだが、「パスワードのハッシュに Crypto.sign 使うんじゃない」だそうです。

Misuse as a Password Hash Please do not use Crypto.sign or any kind of HMAC, as they are not designed for password hashing. MACs are designed to be fast and cheap, while password hashing should be slow and expensive. Please look at scrypt, bcrypt, or PBKDF2 – jBCrypt in particular is well known as a bcrypt implementation in Java.

で、ここに書かれていたのが jBCrypt です。

で、早速使ってみたわけですが、まずは参照追加。

libraryDependencies ++= Seq(
    // 中略
    "org.mindrot" % "jbcrypt" % "0.3m"
)

そしたらしれっと

def salt: String = BCrypt.gensalt()

val hashed = BCrypt.hashpw("password", salt)

if (BCrypt.checkpw("password", hashed)) "Accept" else "NoooooOO!"

salt をハッシュ化するたびに実行して、それを保存。
hashed には salt 情報も入ってるので、そのまま検証できるっぽい。