ちりもつもればミルキーウェイ

好奇心に可処分時間が奪われる

MCFとかPHC string formatとか

はじめに

パスワードハッシュを目的としたアルゴリズムではよく使われてる形式がある。
ふるくは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にいい感じのドキュメントがある

passlib.readthedocs.io

これを斜め読みするかぎり、互換がないアルゴリズムを取り扱うためのアドホックな対応として出発していているよう。

カチッとした仕様がないから各位よしなにやってるのが現状ぽい。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にしとけばよし!という雰囲気らしいので読み慣れておくと良さそうですね。まあ区切り文字がちゃんとあるのでみればわかるか。