ハッシュ、ソルト、bcrypt、Argon2:まともなサイトがあなたのパスワードにしていること

公開日 著者 David Carrero

まともなサイトは、あなたのパスワードを知らない。知りたくないのではない。知りようが ないのだ。

種も仕掛けもあるように聞こえる。打ち込むたびにシステムは通してくれるし、通すために は何かを照合しているはずだから。だが照合することは、知っていることではない。 サーバーが保管しているのは、あなたのパスワードから計算された指紋だ。あなたが 打ち込むと、もう一度指紋を計算して、見比べる。一致すれば、どうぞお通りください。 パスワードそのものが、どこかに書かれている必要は一度もない。

そこから、まともなサービスとそうでないものを見分けるいちばんはっきりした合図が出て くる。忘れたと言ったらパスワードをメールで送ってきた——それは保存していたということ だ。そして保存されているものは、遅かれ早かれ、誰か別の人の手に渡る。

1979年 保存しないという発想と、わざと遅くするという発想

1979年、ロバート・モリスとケン・トンプソンCommunications of the ACM に 「Password Security: A Case History」を発表し、自分たちがUnixでやったことを書いた。 学んだことの報告書であり、そこには今では当たり前とされている二つの発想が据えられて いる。

ひとつめは彼らの発明ではない——パスワードの代わりにハッシュを保存するのは以前から 行われていた——が、誰よりもうまく説明した。パスワードを保存せず、そのハッシュを 保存する。 パスワードを、でたらめな見た目の値に変換する関数だ。しかも来た道を戻れ ない。ハッシュからパスワードへは帰れない。

ふたつめは正真正銘、彼らのものだ。ソルトである。利用者ごとに違う乱数を、ハッシュ を計算する前にパスワードへ混ぜる。ソルトがなければ、同じパスワードを使った二人は同じ ハッシュを持つことになり——盗まれたファイルは間違い探しならぬ「同じもの探し」に成り 下がる——さらに悪いことに、誰かが一度だけ巨大な表を計算しておいて、世界中のデータ ベースに使い回せてしまう。ソルトはあなたのパスワードを当てにくくするのではない。 当てても他の誰の役にも立たないようにするのだ。

だがこの同じ論文には三つめの発想がある。引用されることははるかに少なく、そしてここ で肝心なのはそれだ。彼らは関数を意図して遅くした。手抜かりではない。狙ってやった のである。パスワードを暗号化するのに、技術的に必要な分よりずっと多くの手間をかけた。 毎朝一度入るだけの人には、どうでもいい違いだからだ。候補を何百万個も試す人には、そう ではない。

半世紀近く前の一文に、話のすべてが入っている。

遅さだけが誠実な防御である理由

コンピューターの防御はたいてい非対称だ。守る側には安く、攻める側には高くつく。暗号化 は安い。鍵なしの復号は無理筋である。守る側は構造的に有利な札を持って勝負している。

パスワードの保存はそうではない。ここでは守る側と攻める側が、まったく同じ関数を実行 する。 あなたは正解したことを確かめるためにハッシュを計算する。向こうは正解したかを 確かめるためにハッシュを計算する。セキュリティのなかで唯一、両者が同じ脚で走る競走だ。

相手より速く走れないとき、残る手はひとつしかない。二人ぶんまとめて、コースの通行料 を上げることだ。あなたはその代金をログイン一回につき一度払う。向こうは試行一回に つき一度払う。向こうに必要な試行回数はあなたより桁違いに多いのだから、同じ請求書が 両者にもたらす痛みは比べものにならない。パスワードハッシュがやっているのはそれである。

だから、速くて他の用途では文句なしに優秀な関数——たとえばSHA-256——は、ここでは 最悪の選択になる。速いからだ。速さこそ、ここでいちばん要らないものである。

1999年 bcryptと、調節できる部品としてのコスト

遅い関数の困ったところは、ハードウェアがじっとしていてくれないことだ。1979年に遅かった ものは、しばらくすれば一瞬になる。ある十年のコンピューターに合わせて調整した防御は、 誰も手を触れないまま、ひとりでに老いていく。

1999年、ニールス・プロヴォスとデイヴィッド・マジエールがUSENIX Annual Technical Conferenceでbcryptを発表した。論題がすでにすべてを言っている。A Future-Adaptable Password Scheme

発想はこうだ。コストを関数の中ではなく、パラメーターに置く。bcryptにはあなたが 決めるコスト係数があり、それがハッシュと一緒に保存される。ハードウェアがうんと速く なったら、数字を上げる。すると新しいパスワードは、また相応の値段に戻る。アルゴリズム を取り替えることなく、である。

自分自身がいずれ古びることを前提にし、そのための備えまで組み込んだ設計だ。 そんな ことをするソフトウェアは、ほとんどない。

2009年 scryptと、時間だけでは足りないという発見

bcryptは計算時間を高くつくようにした。そしてそれは効いた——攻撃者が、守る側と同じ種類 の機械を使うのをやめるまでは。

サーバーには、速くて何でもこなす核がいくつか載っている。GPUには、小さな核が途方もない 数だけ並んでいて、同じことを一斉にやる。ASICはさらに先へ行く。たったひとつの演算を実行 するためだけに焼かれたシリコンだ。あなたの防御が「この演算にはXかかる」でできているなら、 誰かがXを一度にたくさんこなすハードウェアを作れてしまう。守る側は、相変わらず自分の サーバー一台のままだ。

2009年、コリン・パーシヴァルが別の理屈でscryptを発表した。Stronger Key Derivation via Sequential Memory-Hard Functions。コストが計算にしかないなら、並列化 されてしまう。だがメモリはただではもらえない。関数に大量のRAMを使わせ、しかも回避 できない順序でそこを巡らせる。すると途端に、攻撃者は核を増やせなくなる。核ひとつひとつ に、それぞれ自前のメモリが要るからだ。そしてGPUの核が持っているのは、有り余る演算力と、 一個あたりごくわずかなRAMである。

パーシヴァルは演算を高くしたのではない。それを大量に繰り返すために必要なハードウェア を高くした。 これは階層がひとつ違う。攻撃者の時計ではなく、攻撃者の予算を狙い撃ちに している。

2015年 Argon2と、議論の終わり

もっともな選択肢が複数あるという状態は、誰の役にも立たなかった。そこで暗号の世界は、 何かに決着をつけたいときのいつものやり方をとった。公開コンペである。Password Hashing Competition は候補を募り、何年もかけて開かれた分析にさらし、2015年Argon2を 優勝と告げた。

Argon2は二つの教訓を受け継いでいる。時間のコストとメモリのコスト。しかも両方を別々に 調節でき、さらにスレッド数も指定できる。魔法ではない。1979年と1999年と2009年を整理して まとめ直したもので、それを破ろうとするのが仕事だった人たちの手で点検されている。

これがあなたにとって何を意味するか

ここまでの話の大半はあなたの手の届かないところにある。それは言っておくべきだ。ハッシュ を選ぶのはサイトであって、あなたではない。 世界一のパスワードを持っていても、Excelに 平文で保存される可能性はある。

だが方程式のもう片側は、あなた次第だ。この建物ぜんぶ——ソルトも、コストも、メモリも ——は、攻撃者の一回ごとの試行を高くつかせるためにある。何回試す必要があるかを決めて いるのは、あなたのパスワードだ。辞書に載っているなら、どんなに遅い関数も助けにならない。 最初のほうで落ちる。長くて何にも似ていないなら、その一回あたりの値段に、使える時間には 到底収まらない回数が掛け算される。

だから私たちのジェネレーターは百分率ではなくエントロピーのビット数を見せる し、チェッカーは記号を数えるより先に、あなたのパスワードを辞書のなかに 探しにいく。向こうは一回あたりの値段を決める。あなたは回数を決める。 どちらの半分も、 もう片方なしでは働かない。

そう、結局はいつもと同じ問いのままだ。ただし今は、向こう側で誰かが毎秒何度もその答えを 出そうとしていて、私たちは1979年からずっと、その一度一度に金を払わせようとしている。


出典:R. モリス、K. トンプソン「Password Security: A Case History」Communications of the ACM、1979年 · N. プロヴォス、D. マジエール「A Future-Adaptable Password Scheme」 USENIX Annual Technical Conference、1999年(bcrypt) · C. パーシヴァル「Stronger Key Derivation via Sequential Memory-Hard Functions」2009年(scrypt) · Password Hashing Competition、2015年にArgon2が優勝。

← ブログに戻る