総当たり攻撃時のパスワード最大解読時間の表(by 上野宣)について分析した

昨日、上野宣（@sen_u）さんがパスワードの総当りに要する時間の表をツイートされ、話題になっています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">総当たり攻撃時のパスワード最大解読時間の表を日本語化した。<a href="https://t.co/cVSNUZkAKv">https://t.co/cVSNUZkAKv</a> <a href="https://t.co/rtS8ixwOqi">pic.twitter.com/rtS8ixwOqi</a></p>&mdash; Sen UENO (@sen_u) <a href="https://twitter.com/sen_u/status/1427538088113283072?ref_src=twsrc%5Etfw">August 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

1万件を超えるリツイートがありますね。大変よく読まれているようです。しかし、この表は何を計測したものでしょうか。上野さんにうかがってもわからないようでした。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">何ですかね？パスワード空間が大きくなると解読に時間が掛かるということくらいがわかりますかね。</p>&mdash; Sen UENO (@sen_u) <a href="https://twitter.com/sen_u/status/1427630896857993227?ref_src=twsrc%5Etfw">August 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

一般に、パスワードの総当たり攻撃（ブルートフォースアタック）というと、以下の二通りが考えられます。

- ウェブサイト等でパスワードを順番に試す（オンライン攻撃）
- サイト等から漏洩したパスワードのハッシュ値から平文のパスワード復元する（オフライン攻撃）

どっちかなーと思ったところ、上野さんが別の（?）ソースを教えて下さいました。図表は同じですが、以下の説明があります。

> These numbers as the time it takes if a Hask of your password was obtained and then bruteforced. This can be achieved using latest hardware that can be readily purchased on the market,Gigabyte GeForce RTX 2080 Ti Turbo 11GB Graphics Card with Costs about 1000 GBP
[How long does it take to crack your password? — Response IT - IT Support Surrey/London](https://www.response-it.co.uk/news/2020/9/2/how-long-does-it-take-to-crack-your-password)より引用

以下、私訳を示します。

> これらの数値は、パスワードのHask（訳注: おそらくHASH）が取得されてからブルートフォースされた場合にかかる時間です。これは、市場で容易に購入できる最新のハードウェア、Gigabyte GeForce RTX 2080 Ti Turbo11GBグラフィックスカードを使用して実現できます。コストは約1000英ポンド（約15万円）です。

HaskがHashのタイポだと仮定して、おそらくオフライン攻撃であることがわかりました。しかし、どのようなハッシュ（MD5、SHA-1、SHA-256、bcrypt等）なのかは明記されていません。そこで、RTX 2080のハッシュ計算速度から、どのハッシュであるかを逆算で求めてみましょう。
さまざまなGPUについて、[Jeremi Gosney](https://twitter.com/jmgosney/)氏がハッシュの計算速度を発表していて、その中にRTX 2080も含まれます。氏はGPUによるハッシュ総当り業界の有名人です。

[Nvidia RTX 2080 SUPER FE Hashcat Benchmarks](https://gist.github.com/epixoip/47098d25f171ec1808b519615be1b90d)

こちらから、主要なハッシュアルゴリズムのRTX 2080での計算速度を拾ってみましょう。以下の表で「MH/sec」とあるのは、1秒間にハッシュをいくつ（100万単位）計算できるかという意味です。

|Algorithm|Speed(MH/sec)|
|:-:|-:|
|MD5|40116.1|
|SHA-1|13988.8|
|SHA-256|5736.9|
|SHA-512|1839.9|

この値を用いて、英大文字小文字8文字の場合で、各ハッシュアルゴリズムでのハッシュ総当りに要する時間を計算してみましょう。上野さんの紹介した表では、このケースでは22分で総当り可能とあります。
この場合のパスワードのパターンの数は、

$52 ^ 8 =  53,459,728,531,456 $（約53兆）

となります。それを上記のMH/secで割ると、秒数が算出されます。その結果を下表に示します。処理時間は分に換算しています。

|Algorithm|処理時間（分）|
|:-:|-:|
|MD5|22.2|
|SHA-1|63.7|
|SHA-256|155.3|
|SHA-512|484.3|

この結果から、先の表の前提となるハッシュアルゴリズムはMD5であろうという結論になります。

## 考察

上野さんの示した表は非常にインパクトの強いもので、8文字のパスワードなど「瞬殺」されてしまうのかぁと思った人も多いと思います。しかし、この表はパスワードのハッシュ値(MD5)が漏洩した後、ハッシュ値からパスワードを復元するのに要する時間です。
そうだとしても、瞬殺はまずいのですが、それを避けるために、MD5ではなく、パスワード保存に適したハッシュ保存の方法があります。先の各ハッシュの計算速度からbcryptというアルゴリズムの計算速度を調べると、27477 H/sec （0.027477 MH/sec)となっていますので、同じ条件で処理時間を求めると、32426956分（61年8ヶ月）となります。永遠に大丈夫というわけではありませんが、パスワード漏洩を検知して、利用者にパスワード変更を促し対処するには、まずまず十分な時間です。
以下の表はRTX 2080を448発並列(!)で処理した場合の各ハッシュの総当りに要する時間を示すもの（@Typhon666_deathさんに教えていただきました）ですが、MD5のような~~脆弱な~~処理が高速でパスワード保存に適さないアルゴリズム[^1]ではなく、bcryptのようなパスワード保存に適した（処理に時間がかかる）アルゴリズムが求められていることがわかります。

[^1]: 当初「脆弱な」と記載しておりましたが、これだとMD5のハッシュ関数のとしての脆弱性を想起してしまうので、「処理が高速でパスワード保存に適さない」と書き換えました。（2021年8月19日13:33編集）

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">以前、Terahashが似たようなの公開してるときは448xNVIDIA RTX 2080とかあったので、ここらへんがあるとよさそうですね。<a href="https://t.co/4dyBlBnQsR">pic.twitter.com/4dyBlBnQsR</a></p>&mdash; Typhon(ﾃﾎﾟ)✡0827secjaws (@Typhon666_death) <a href="https://twitter.com/Typhon666_death/status/1427562978946158593?ref_src=twsrc%5Etfw">August 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 結論

上野さんの紹介したパスワード総当りに要する時間の表は、MD5ハッシュで保存したパスワードの総当りに要する時間を示したものでした。単に表だけを見ると、「8桁パスワードなど瞬殺だな」と思う人が多いと思いますが、現在の技術水準ではMD5によるハッシュ保存は否定されており、bcryptなど安全なパスワード保存方法が推奨されます。そして、bcrypt等を使う前提では、8桁パスワードは絶対だめとまではいえません。パスワード設定に関して大きな影響力をもつNIST SP800-63-3でも、以下のように推奨されています。

- 利用者が設定する場合、最小8文字
- 管理者側が設定する場合、最小6文字

参考: [世界の電子認証基準が変わる：NIST SP800-63-3を読み解く – サポート − トラスト・ログイン byGMO【旧SKUID(スクイド)】](https://support.trustlogin.com/hc/ja/articles/115004031154-%E4%B8%96%E7%95%8C%E3%81%AE%E9%9B%BB%E5%AD%90%E8%AA%8D%E8%A8%BC%E5%9F%BA%E6%BA%96%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8B-NIST-SP800-63-3%E3%82%92%E8%AA%AD%E3%81%BF%E8%A7%A3%E3%81%8F)

前提条件なしで表だけを見るとこのような考察ではできないという意味で、以下のように発言させていただきました。

https://twitter.com/ockeghem/status/1427540751819304960

## 参考

[パスワードは何桁以上にするのが良いですか？に対する徳丸 浩さんの回答 - Quora](https://jp.quora.com/pasuwa-do-ha-nani-keta-ijou-ni-suru-no-ga-yoi-desu-ka/answers/141529652)

以下は、パスワードに関する入門動画です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/p_2tiP0qclQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

今回のテーマに近い動画はこちら。
<iframe width="560" height="315" src="https://www.youtube.com/embed/D2ZK2z7hCj8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

パスワード保護の具体的な方法はこちらの動画をどうぞ。
<iframe width="560" height="315" src="https://www.youtube.com/embed/5jHALFTQ0ow" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>