はじめに
パスワードハッシュを目的としたアルゴリズムではよく使われてる形式がある。
ふるくはMCF (Modular Crypt Format)とか、あたらしめのアルゴリズムではPHC String Format (成り立ち的にPHCはたぶん Password Hashing Competitionの略)とかが使われてる。
フォーマットとか背景とかをメモがてらまとめる
MCF
いろんなとこで使われてたんだけど、カチッと仕様が定まってるわけではないっぽい。Bcryptでは以下の感じのフォーマット
$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW \__/\/ \____________________/\_____________________________/ Alg Cost Salt Hash
まあアルゴリズムやコスト、saltとかhash本体とかがぺたっと出てるフォーマットぽい。
PassLibにいい感じのドキュメントがある
これを斜め読みするかぎり、互換がないアルゴリズムを取り扱うためのアドホックな対応として出発していているよう。
カチッとした仕様がないから各位よしなにやってるのが現状ぽい。Bcryptではsaltとhashの間の$を省略してたりするらしく、なんというかさまざまで大変ですねという感情を抱いた。
PHC string format
↑の仕様が決まってない状態だと取り回しづらいので Password Hash Competition がつくってる仕様がPHC string format
Password Hash Competition 自体は2014年とかに募集おわってArgon2が優勝したやつなんだけど、それに提出する際このフォーマットを守らせてたぽい。
なので最近いい感じのパスワードハッシュに使われるアルゴリズムはこのフォーマットを守ってることが多い。
フォーマットは以下
$argon2id$v=19$m=65536,t=2,p=1$gZiV/M1gPc22ElAH/Jh1Hw$CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno
もろもろパラメータを柔軟に扱えて、かつ仕様が決まってることがめでたいというかんじか。
パスワードハッシュアルゴリズム界隈ではあたらしいのはPHC string formatにしとけばよし!という雰囲気らしいので読み慣れておくと良さそうですね。まあ区切り文字がちゃんとあるのでみればわかるか。