web-dev-qa-db-ja.com

SHA-1はパスワードを保存するために安全ですか?

結論:SHA-1は、プリイメージ攻撃に対して何でも安全ですが、計算は簡単です。攻撃。 (SHA-256などの後継機にも同じことが言えます。)状況によっては、計算コストが高くなるように設計されたハッシュ関数(bcryptなど)の方が適している場合があります。


「SHA-1が壊れている」などの発言を頻繁に行う人もいるので、その意味を正確に理解しようとしています。 SHA-1パスワードハッシュのデータベースがあり、攻撃者が最先端のSHA-1破壊アルゴリズムと100,000台のマシンを備えたボットネットにアクセスすると仮定します。 (10万台の家庭用コンピューターを制御できれば、1秒あたり約10 ^ 15の操作を実行できます。)

  1. 一人のユーザーのパスワードを見つけますか?
  2. 特定のユーザーのパスワードを見つけますか?
  3. すべてのユーザーのパスワードを見つけますか?
  4. ユーザーの1人としてログインする方法を見つけますか?
  5. 特定のユーザーとしてログインする方法を見つけますか?

パスワードがソルトされている場合、それはどのように変わりますか?ソルティングの方法(プレフィックス、ポストフィックス、両方、またはxor-ingのようなより複雑なもの)は重要ですか?

いくつかのグーグルの後、ここに私の現在の理解があります。私が何かを誤解した場合は答えを修正してください。

  • 塩がない場合、Rainbow攻撃はすべてのパスワードをすぐに見つけます(極端に長いパスワードを除く)。
  • 十分に長いランダムソルトがある場合、パスワードを見つける最も効果的な方法は、ブルートフォース攻撃または辞書攻撃です。衝突攻撃もプリイメージ攻撃も実際のパスワードを見つける助けにはならないため、SHA-1に対する暗号化攻撃はここでは役に立ちません。どのアルゴリズムが使用されているかは重要ではありません。MD5またはMD4を使用することもでき、パスワードも同じくらい安全です(SHA-1ハッシュの計算が遅いため、わずかな違いがあります)。
  • 「ちょうど安全」の安全性を評価するために、1回のsha1の実行に1000回の操作が必要であり、パスワードに大文字、小文字、数字(つまり60文字)が含まれると仮定します。これは、攻撃者が10をテストできることを意味します15* 60 * 60 * 24/1000〜= 1017 1日あたりの潜在的なパスワード。ブルートフォース攻撃の場合、3時間で最大9文字、1週間で最大10文字、1年で最大11文字のすべてのパスワードをテストすることになります。 (追加の文字ごとに60倍かかります。)辞書攻撃ははるかに高速です(1台のコンピューターを使用する攻撃者でさえ数時間で攻撃することができます)が、弱いパスワードのみを検出します。
  • ユーザーとしてログインするために、攻撃者は正確なパスワードを見つける必要はありません。同じハッシュになる文字列を見つけるだけで十分です。これは、最初のプリイメージ攻撃と呼ばれます。私の知る限り、SHA-1に対するプリイメージ攻撃はありません。 (ブルートフォース攻撃には2160 つまり、理論上の攻撃者には1030 それをやってのける年。理論的な可能性の限界は約2です60 SHA-1の縮小版に対するプレイメージ攻撃 無視できる影響(80の代わりに44ステップを使用する縮小SHA-1の場合、攻撃時間は2から下がっています160 2への操作157)。理論上の可能性の範囲内であるSHA-1に対する衝突攻撃があります( 私が見つけた最高の は2から時間を減らします80 2へ52)、しかし、それらは塩漬けをしなくても、パスワードハッシュに対しては役に立たない。

要するに、SHA-1でパスワードを保存することは完全に安全に思えます。私は何か見落としてますか?

更新:Marceloは 2の2番目のプレイメージ攻撃について言及している記事を指摘しました106 操作 。 (編集:Thomasの説明 のように、この攻撃は現実のシナリオには適用されない架空の構成です。)ただし、これは、SHA-1をキー派生関数として使用する場合の危険性を示しています。一般に、衝突攻撃または2番目のプレイメージ攻撃が最終的に最初のプレイメージ攻撃に変わる可能性があると考える正当な理由はありますか?

146
Tgr

あなたの質問に対する簡単な答えは:SHA-1はあなたが得ることができる限り安全です。 MD5も、MD4でも問題ありません。しかし、それは一部の投資家を緊張させる可能性があります。 public relationsの場合、「より良い」ハッシュ関数を使用するのが最善です。 SHA-256(出力を160ビットまたは128ビットに切り捨てた場合でも)(ストレージコストを節約するため)。いくつかの SHA-3ラウンド2候補 は、SHA-1よりも高速であると思われますが、間違いなく「より安全」です。まだ少し新しいので、SHA-256またはSHA-512に固執する方が、今より安全なルートです。それはあなたがプロフェッショナルで慎重に見えるようにするでしょう、それは良いことです。

「できる限り安全」は「完全に安全」と同じではないことに注意してください。かなり長い説明については、以下を参照してください。

既知の攻撃について:

MD4、MD5、およびSHA-1に対する既知の攻撃は衝突に関するものであり、プリイメージ耐性には影響しません。 MD4には、HMAC/MD4を破ろうとするときに(理論的にのみ)悪用される可能性があるいくつかの弱点があることが示されていますが、これは問題には当てはまりません。 2106 KesleyとSchneierによる論文の2番目のプリイメージ攻撃は、非常に長い入力にのみ適用される一般的なトレードオフです(260 バイト;それは100万テラバイトです。106+ 60が160を超えることに注意してください。それはあなたがトレードオフに魔法がないことを見るところです)。

このメッセージの残りの部分では、使用するハッシュ関数(SHA-1など)が、攻撃者が使用できる特別なプロパティのない「ブラックボックス」であると想定しています。これは、「壊れた」ハッシュ関数MD5およびSHA-1を使用した場合でもすぐに使用できるものです。

レインボーテーブルについて:

「レインボー攻撃」は、実際には辞書の攻撃またはブルートフォース攻撃です。これは、1980年にHellmanによって最初に説明された 時間とメモリのトレードオフ から派生したものです。[〜#〜] n [〜#〜]可能なパスワード(辞書のサイズ、または2n nビットの出力でハッシュ関数をブルートフォースすることを検討する場合、[〜#〜] nを事前計算するタイムシェアリング攻撃があります。 [〜#〜]ハッシュ化されたパスワードを大きなテーブルに保存します。ハッシュ出力をソートすると、1回の検索でパスワードを取得できます。 Rainbow tableは、スペースを大幅に削減してそのテーブルを保存するスマートな方法です。 N/tハッシュされたパスワードのみを保存し、O(tでパスワードを解読します。2)ルックアップ。レインボーテーブルを使用すると、実際に保存できるものよりもはるかに大きい事前計算済みテーブルを仮想的に処理できます。

ただし、レインボーであろうとなかろうと、攻撃者は完全な攻撃を少なくとも1回実行する必要があります。これは、いくつかの連続した最適化レイヤーとして見ることができます。

  1. ブルートフォース/辞書攻撃には、各パスワードを解読するためのコスト[〜#〜] n [〜#〜]があります。
  2. 事前計算済みのテーブルでは、攻撃者はそのコストを支払います[〜#〜] n [〜#〜]onceその後、パスワードごとに非常に小さな追加コストで多くのパスワードを攻撃できます。
  3. 事前計算されたテーブルがレインボーテーブルである場合、storageのため、[〜#〜] n [〜#〜]は多少大きくなる可能性がありますコストが削減されます。 [〜#〜] n [〜#〜]のボトルネックは、攻撃者がハードディスクのサイズではなく、召集できるCPUパワーになります。

[〜#〜] n [〜#〜]がCPUコストのハッシュ[〜#〜] n [〜#〜]パスワードは馬鹿げているため、Rainbowテーブルが使用されているかどうかに関係なく、このような攻撃は実行できません。これは、ブルートフォース攻撃を実行不可能にするために、出力が80ビット以上の(プリイメージ耐性)ハッシュ関数で十分であることを意味します。

塩について:

塩は、事前計算を無効にする方法です。上記の説明では、ソルトは攻撃者をステップ1に戻します:ソルティングは、攻撃者が複数の攻撃者間でO([〜#〜] n [〜#〜])コストを共有することを防ぎますパスワード。事前計算されたテーブルa fortioriRainbowテーブルは、実行不可能になりました。

ハッシュ化されたデータがpasswordsで構成されている場合、つまりランダムな人間の脳内に収まるものの場合、ソルティングが必要な場合、[〜#〜] n [〜# 〜]は非常に低い場合があります。人間はパスワードの選択と記憶が非常に苦手です。これが「辞書攻撃」の目的です。多くのユーザーパスワードがその特別に選択されたスペースにあるという仮定の下で、潜在的なパスワード(「辞書」)のスペースを削減します。

したがって、ソルティングは、攻撃者が事前に計算されたテーブル、特に事前に計算されたRainbowテーブルを使用することを少なくとも防ぎます。これは、攻撃者が1つまたは2つのパスワードを解読できることを想定しています。余分なオーバーヘッドをほとんど伴わずに、他の1000個のパスワードを破らないようにします。

また、塩漬けは広報に適しています。

SHA-1コストについて:

SHA-1の基本コストは、64バイトブロックのハッシュです。これがSHA-1の仕組みです。データはパディングされ、64バイトブロックに分割されます。 1つのブロックを処理するコストは、Intel Core2システムで約500クロックサイクルであり、これはシングルコアの場合です。 MD5とMD4は高速で、それぞれ約400サイクルと250サイクルをカウントします。ほとんどの最新のCPUには複数のコアがあるため、それに応じて乗算することを忘れないでください。

いくつかの塩漬けスキームは、巨大な塩を処方します。例えばハッシュ関数に入るのは、実際には単一の128ビットソルトの40000個の連続したコピーで、その後にパスワード自体が続きます。これにより、正当なユーザーと攻撃者の両方にとって、パスワードハッシュのコストが高くなります(この例では10000倍)。これが良いアイデアであるかどうかは、セットアップに依存します。デスクトップシステムへのログインの場合、これは良いことです。ユーザーは、パスワードをハッシュするのに1µsではなく10msかかったことにも気付かないでしょう。しかし、攻撃者のコストは非常に顕著な要因10000だけ上昇しました。1秒あたり数千のクライアントを持つ共有サーバーでは、総コストが法外に高くなる可能性があります。概念的には、正当なユーザーと攻撃者にとって同じ要因で水準を引き上げることは、最終的には優れたセキュリティではありません。しかし、特定の状況では価値のあるアイデアになる可能性があります。

オンライン攻撃について:

上記のすべてはoffline攻撃を打ち負かすことに関するものです。オフライン攻撃は、攻撃者がパスワードを「テスト」するために必要なすべてのデータを取得する攻撃です。例えば攻撃者はハッシュ化されたパスワードを保持しているデータベースのコピーを入手する可能性があります。オフライン攻撃では、攻撃者は計算リソースによってのみ制限されます。逆に、online攻撃は、攻撃者による各推測が正直な検証者を通過しなければならない攻撃です(たとえば、攻撃者は単に攻撃されたシステムにログインしようとします)。オンライン攻撃は、1秒間に試行できるパスワードの数に制限を設けることにより阻止されます。極端な例は、3つの間違ったPINの後にシャットダウンするスマートカードです。

通常、パスワードのセキュリティについては、攻撃者がオフライン攻撃を構築できないようにシステムを調整することで、より多くの成果が得られます。それは、Unixシステムが行うことです。ハッシュ化されたパスワードは、かつては誰でも読める/etc/passwordファイル、現在は/etc/shadowいくつかの特権アプリケーションを除き、読み取りアクセスに対して保護されているファイル。ここでの仮定は、攻撃者が/etc/shadow、その後、彼はおそらくシステムを十分に制御できるので、パスワードはもう必要ありません...

208
Thomas Pornin

これまでの回答ではGPUについて言及していませんが、パスワードがソルトされていても、データベース全体が数日または数週間ではなく数分または数時間でブルートフォースできる程度までSHA-1ハッシュを並列化できます。

Bcryptやscryptなどの最新のパスワードハッシュアルゴリズムは、メモリ要件がはるかに高いブロック暗号であるため(GPUでのメモリアクセスを同程度に並列化することはできないため)、GPU上で実行するのが困難になるように特別に設計されています。また、技術が向上するにつれて、オンザフライで遅くすることができる「作業機能」も備えています。

つまり、仕事に最適なツールのみを使用する必要があります。そして、SHA-1は最先端技術からはほど遠いものです。

さらに読むには:

30
jammycakes

あなたの説明は、最新技術に対して正確に聞こえます。

ただし、ハッシュ関数の単一の反復を使用しないでください。少なくとも、何度も反復する必要があります(ハッシュを1000回反復すると、攻撃者の作業が1000倍になります。同じ量だけ作業が増加しますが、あなたは彼らよりもはるかに少ないパスワードハッシュを行っています)。

ただし、理想的には、 here のような既存のパスワードストレージプリミティブを使用する必要があります。

7
Nick Johnson

SHA1はメッセージダイジェストであり、それはneverがパスワードであることを意味していました-ハッシュ(またはキー派生)関数。 (HMAC-SHA1を使用したPBKDF2のように、KDFのビルディングブロックとして使用できます。)

パスワードハッシュ関数は、辞書攻撃とレインボーテーブルから保護する必要があります。この目標を達成するために、いくつかのアルゴリズムが設計されています。

現在、最良の選択はおそらくArgon2です。このパスワードハッシュ関数ファミリは、2015年のパスワードハッシュコンペティションで優勝しました。

Argon2が使用できない場合、他の標準化されたパスワードハッシュまたはキー派生関数はPBKDF2のみです。これは古いNISTです。標準。他の選択肢として、標準を使用する必要がない場合は、bcryptscryptを含めます。

ウィキペディアには、これらの機能のページがあります。

7
Erwan Legrand

SHA-1で深刻な脆弱性が発見され、ブルートフォースよりもはるかに高速に検索されます。まだほとんど手に負えませんが、それほど長い間そうなるとは予想されていません。妄想的なプログラマーは、SHA-2ファミリーの何かを好みます。

元の2005年の結果に関する この記事 から:

「今は火の出口まで歩いて走る時間です。煙は見えませんが、火災警報器は消えています。」

現在の暗号解読によりSHA-1が安全でなくなるということではなく、暗号コミュニティは、悪いニュースがすぐそこにあるのではないかと心配しています。この恐怖はSHA-2にも当てはまります。SHA-2は、はるかに大きな検索スペースではありますが、SHA-1と同じ欠陥を示すため、進行中の SHA- の探求です。

要するに、SHA-1は今のところ安全であり、おそらくしばらくは来るでしょうが、暗号コミュニティは予後に不快です。

4
Marcelo Cantos

2017年2月の時点で、SHA-1は安全であるとは見なされなくなりました。 Googleは、完全な非縮小ラウンドSHA-1に対する衝突攻撃の成功を報告しています( レポートへのリンク )。 Googleの発表については、 ここをクリック

編集:他の人が指摘したように、パスワードはハッシュ衝突攻撃に対して脆弱ではありません。ただし、一般的なガイドラインとして、セキュリティ関連のアプリケーションにはSHA-1を選択しません。より良い選択肢があります。

4
Aaron

ソルトパスワードを保存する場合、実用的な目的にはSHA-1で十分です。 SHA-2はより安全であると考えられていますが、本当に妄想的である理由がない限り、SHA-1は問題ではありません。

NIST says の内容は次のとおりです。

これまでにSHA-1で提示された結果は、そのセキュリティを疑問視していません。ただし、技術の進歩により、NISTは2010年までに、より大きく強力なハッシュ関数(SHA-224、SHA-256、SHA-384、およびSHA-512)を優先してSHA-1を段階的に廃止する予定です。

3
VladV