web-dev-qa-db-ja.com

nginxがHTTP基本認証用に受け入れるすべてのハッシュ形式は、総当たりに対して弱いですか?

http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html によると、nginxは次のタイプのパスワードハッシュを読み取ることができます。

crypt()、apr1、SHA1およびSSHA。

これは私がこれらのハッシュがどのように機能するか、そしてそれらの問題が何であるかを理解する方法です:

crypt()は、8文字より後の文字をすべて破棄するため、私のパスワードが「12345678UltraSecurePa $$ w0rd」の場合、「12345678」と入力してログインできます。それは強力な(長い)パスワードの目的を無効にしませんか?最近では、8文字のブルートフォースで任意の文字のパスワードを強制するのは簡単なようです。 cryptが平文よりも安全であるべき理由がわかりません。

apr1はMD5ですが、1000倍遅くなります 。最近はまだ非常に弱いです。 2つ以上のGPUで1秒あたり300.000.000.000(3,000億)を超えるハッシュを介したブルートフォーシングのレポートを見つけることができます

SHA1はMD5よりもそれほど優れていません。高速になるように最適化されたハッシュアルゴリズムであるため、ブルートフォース攻撃に対して脆弱です。また、この場合は塩漬けされません。

そして最後の方法はソルトSHA1です。これは、nginxでhttp基本認証パスワードをハッシュする最も弱い方法のようです。しかし、誰かがハッシュを盗むとき、彼はソルトも持っています(ソルトはbase64でエンコードされているだけです)。そのため、SSHAには、「ハッシュ化」パスワードに高速ハッシュアルゴリズムを使用するという弱点があります。

nginxはbcryptまたはPBKDF2を使用できません。

結論:HTTP基本認証ハッシュを「安全」にしたい場合(安全とは、ハッシュをクラックするのに時間がかかりすぎることを意味します)、次のルールに従う必要があります。

  1. 決して暗号を使用しないでください。
  2. これはブルートフォース攻撃に対して十分に長いように見えるため、少なくとも16文字のパスワードを強制します(ここでは、しばらくの間、辞書攻撃を無視しましょう)。

そして:nginxの人たちに、HTTP基本認証のためのより良いハッシュ方法を実装すべきだと説得します。

私の結論に誤りはありますか?

17
ahofmann

私自身はこれをテストしていませんが、Nginxのソースコードを読んでいると、libcのcrypt()関数を直接使用しているようです。お使いのOSによっては、bcryptまたはglibcのSHA-256/SHA-512スキームのいずれかで、正気なcrypt()実装を使用できる場合があります。 Nginxで使用できるかどうかを確認するのは一見の価値があります。

12
Matt Nordhoff