あるサイトが、あなたのパスワードは破るのに三百万年かかりますと告げてくるとき、 その文の肝心な部分は伏せられている。正しい問いは「どれくらいかかるか」ではない。 何を相手に、どれくらいかかるかだ。
そして何を相手にのほうは、あなたが決めたのではない。決めたのは、2019年に スニーカーを買ったあの通販サイトの開発者で、自分のデータベースにあなたのパスワード をどう保存するか選んだときのことだ。あなたは二十文字の同じ文字列を、両方のサイトに 打ち込んだ。片方では何世紀も持ちこたえ、片方では昼めしの前に落ちる。
方程式から抜け落ちている数字
総当たり攻撃はひどく退屈な算数である。試さなければならない候補の数を、一秒間に 試せる候補の数で割る。前者はあなたのパスワード次第だ——長さ、使った文字の種類、 辞書に載っているかどうか。後者はあなたとは一切関係がない。
後者を決めるのは二つのものだ。攻撃者のハードウェアと、そして何より、サイトが あなたのパスワードを利用者テーブルに並ぶあの謎の文字列へ変換したときの関数である。 その関数をハッシュと呼ぶ。そして計算にかかる手間は、関数ごとにまるで違う。
MD5とSHA-1は速いように設計された。それは美点である。汎用のハッシュ関数であり、 メッセージを要約して完全性を確かめるためのもので、その用途で欲しいのは、コーヒーを 淹れに立つ暇もなく一ギガバイトを処理してくれることだ。誰かがそれをパスワードの保存 に使った瞬間、美点は問題に変わる。毎秒何百万回も計算できる関数とは、攻撃者もまた 毎秒何百万回も計算できる関数ということだ——しかも向こうにはグラフィックボードと、 週末まるごとがある。
bcryptとArgon2は逆の目標で設計された。わざと遅く、しかも——ここが洒落ている—— 遅さを調節できる。ニールス・プロヴォスとデイヴィッド・マジエールが1999年にbcryptを 発表したときの論題が、すべてを言っている。A Future-Adaptable Password Scheme。 ハードウェアが安くなっていくのに合わせて、関数のほうも年々高くつくようにできる、 という発想だ。2015年のPassword Hashing CompetitionでArgon2が優勝したとき、 もうひとひねり加わった。時間を食うだけでなく、メモリを食う。GPUがいちばん気前 よく差し出せないものが、まさにそれである。
速いハッシュと、きちんと設定された遅いハッシュのあいだにあるのは、数割の差ではない。 桁が違う。それも何桁も。
ベンチマークは存在するし、公開されている
これは憶測ではない。hashcat ——世界の半分がパスワードを破るのに使っている道具で、 善玉も含まれる——にはベンチマークのモードがあり、誰でも自分の機械で走らせられる。 アルゴリズムごとに、一秒あたり何回計算できるかを測ってくれる。新しいGPUが出るたび、 コミュニティがその表を公開する。
その表の面白いところは、個々の数字ではない——どうせ世代が変わるたびに賞味期限が 切れる——行と行の距離だ。速い順に並べると、MD5がいちばん上、ひとりだけ別の 惑星にいる。下へ下へと降りていって、表の底にbcryptとArgon2がいる。似ても似つかない 数字を抱えて。パスワードは同じ。GPUも同じ。変わったのは、サイトがそれをどう保存 すると決めたかだけだ。
だから、どのハッシュ相手かを言わない「三百万年」は、計測ではなく宣伝文句である。 行き先を言わずに、うちの車は六時間で着きますと広告するようなものだ。
オフラインとオンライン、交わらない二つの世界
もうひとつ、ほとんど誰も説明しない区別があり、こちらも同じくらい容赦なく結果を 変える。
オンライン攻撃では、攻撃者はログインフォームにパスワードを打ち込む。利用者と 同じやり方だ。速度を決めるのは向こうのハードウェアではなく、サーバーである。試行 回数の上限があるかもしれないし、一時的なロック、キャプチャ、リクエスト間の待ち 時間、同じアドレスから千回失敗したら鳴る警報もある。まともに守られたサイトが相手 なら、オンライン攻撃は遅く、うるさく、そしてなかなか間抜けだ。攻撃者にとって算数 があまりに分が悪いので、純粋な総当たりはほとんど試みられない。いつもの四つの パスワードを何百万というアカウントに当てにいく。あれは別の競技である。
オフライン攻撃では、攻撃者はすでにデータベースの中身を手に入れている。それを 自宅へ持ち帰る。そこにはサーバーもなければ、試行回数の上限も、見張る者もいない。 あるのは自分のグラフィックボードと電気代の請求書だけだ。何か月でも、誰にも気づかれ ずに試せるし、当たったかどうかは自分ひとりでわかる。ハッシュを見比べればいい。 ここではハッシュがすべてを決める。ハッシュだけが、文字どおり唯一のブレーキだからだ。
そして確率について正直に言っておくと、オフラインの筋書きは珍しいものではない。 データベースが流出するたびに起きていることだ。2012年にLinkedInが自社のデータベース を失ったとき、流出した中身を解析した結果、パスワードはSHA-1で、しかもソルトなし で保存されていたことがわかった。速いハッシュで、事前に表を計算されるのを防ぐ材料も 抜きである。あれだけの数があれだけ速く破られたのは、利用者の選び方が悪かったから だけではない。何より、利用者が一度も目にすることのなかった設計上の判断のせいだった。
ここで私たちがやっていること、そしてそれを言う理由
私たちのチェッカーは、毎秒10¹²回の試行、オフライン、速いハッシュ が相手という前提で計算している。ページの結果の下にそう書いてあるし、飾りの透明性 としてではない。その前提がなければ、表示される時間には何の意味もないからだ。
これは意図的に最悪の場合である。データベースはすでに流出しており、攻撃者はまともな ハードウェアを持っており、サイトはあなたのパスワードを常識の範囲でいちばん悪いやり方 で保存しており、おまけに使った文字の種類も長さも知っている、と仮定する。もしそのサイト がbcryptをきちんと設定して使っていたなら、実際の数字は何桁も上がり、あなたのパスワード は私たちが告げるよりはるかに長く持ちこたえる。
私たちは、間違えるならこちら側でありたい。あなたを褒めるチェッカーは、自分自身を 褒めているだけだ。
居心地の悪い結論
あなたのパスワードに、破られるまでの時間などというものはない。あるのはそれを使った サイトの数だけの、破られるまでの時間だ。そしてその時間は、あなたの知らない人たちが、 公開もしていない基準で決めている。
そこから出てくる結論は二つ。いつもと同じものだ。ひとつめ。ハッシュは制御できない のだから、エントロピーのほうを制御しろ。方程式のうちあなたのものである半分だ—— だからジェネレーターは、感じのいい百分率ではなくビット数を見せる。ふたつめ、 そしてこちらのほうが大事だ。サイトごとに別のパスワードなら、MD5で保存していたあの サイトが差し出せるのは、そのサイトの分だけである。
弱い環はあなたのパスワードではない。それを打ち込んだ場所のなかで、いちばん出来の 悪いサイトだ。
出典:hashcatの公開ベンチマーク(hashcat -b)、誰でも参照・再現できる ·
N. プロヴォス、D. マジエール「A Future-Adaptable Password Scheme」USENIX、1999年 ·
Password Hashing Competition、2015年にArgon2が優勝 · password.esのチェッカーが
明示している脅威モデル:毎秒10¹²回の試行、オフライン、速いハッシュ · 2012年の
LinkedInの侵害:同社は流出を認め、ソルトなしSHA-1の使用は公開された流出データの解析
によって確認された。