SHA-1はパスワードの保存に対して安全ですか?


148

結論: 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のようなより複雑なもの)は重要ですか?

これは、ググリングした後の私の現在の理解です。誤解した場合は正解してください。

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

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

更新: Marceloは、2 106操作での2番目のプリイメージ攻撃について言及している記事を指摘しました。(編集:として、トーマスは説明して、この攻撃は現実のシナリオには適用されません仮想的な構造です。)私はまだかかわらず、鍵導出関数としてSHA-1を使用するためにどのようにこの呪文の危険性が表示されません。衝突攻撃または2番目のプリイメージ攻撃が最終的に1番目のプリイメージ攻撃に変わる可能性があると考えるのに、一般的に十分な理由はありますか?


これは現在7歳になり、最後に編集されてから多くのことが起こりました。SHA-1は、パスワードハッシュに対して十分に安全であるとは見なされなくなりました
GordonM、2017年

@GordonMどうしたの?コンピューティング能力の成長に伴い、SHA-1衝突攻撃はますます実用的になってきていますが、ここではあまり関係がありません。SHA-1は、パスワードハッシュに対して実際に安全であったことは決してありません(高速ハッシュは一般に安全ではありません)。
Tgr

SHA-1は、そもそもパスワードを保護するつもりがなかったため、パスワードハッシュに対して安全ではありませんでした...
Azxdreuwa

回答:


209

あなたの質問への短い答えは:SHA-1はあなたが得ることができるのと同じくらい安全です。MD5も、MD4でさえ問題ありません。しかし、一部の投資家は緊張する可能性があります。広報、それはあなたが(ストレージ・コストを節約するために)160または128ビットにその出力を切り捨てる場合でも、「より良い」ハッシュ関数、例えばSHA-256を使用するのが最適です。一部のSHA-3ラウンド2候補は、間違いなく「より安全」である一方で、SHA-1よりも高速であるように見えます。それでもまだ少し新しいので、SHA-256またはSHA-512を使用するほうが安全なルートになります。それはあなたがプロで注意深く見えるようにするでしょう、それは良いことです。

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

既知の攻撃について:

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

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

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

「レインボーアタック」は、実際には辞書またはブルートフォース攻撃のコスト共有です。それはからの誘導体である時間メモリトレードオフ最初のあなたが持っていると仮定すると、1980年にヘルマンによって記述N辞書の大きさ、または2だことの可能なパスワードを(nはあなたがの出力とブルート強制ハッシュ関数を考慮した場合nビット)、N個のハッシュされたパスワードを事前計算して大きなテーブルに格納するタイムシェアリング攻撃があります。ハッシュ出力をソートすると、1回の検索でパスワードを取得できます。レインボーテーブルはかなり減少したスペースで、そのテーブルを格納するためのスマートな方法です。N / tハッシュ化されたパスワードのみを保存し、O(t 2)ルックアップ。レインボーテーブルを使用すると、実際に格納できるテーブルよりもはるかに大きい事前計算済みテーブルを仮想的に処理できます。

ただし、虹の有無にかかわらず、攻撃者は少なくとも一度は完全な攻撃を実行する必要があります。これは、いくつかの連続する最適化レイヤーと見なすことができます。

  1. 総当たり攻撃/辞書攻撃では、各パスワードのクラックにNのコストがかかります。
  2. 事前に計算されたテーブルを使用すると、攻撃者はそのコストNを 一度支払うと、その後パスワードごとに非常に小さい追加コストで多くのパスワードを攻撃できます。
  3. 事前計算されたテーブルがレインボーテーブルである場合、ストレージコストが削減されるため、Nは多少大きくなる可能性があります。Nのボトルネックは、攻撃者が獲得できるCPUパワーであり、ハードディスクのサイズではありません。

場合NはハッシングのCPUコストという十分な大きさであるN個のパスワードは滑稽である、そのような攻撃は関係なく、虹のテーブルが使用されているかどうかのか、現実的ではありません。これは、80ビット以上の出力を持つ(プリイメージ耐性のある)ハッシュ関数は、総当たり攻撃を実行不可能にするのに十分であることを意味します。

塩について:

ソルトは、事前計算を打ち負かす方法です。上記の説明では、ソルトは攻撃者をステップ1に戻します。ソルティングは、攻撃者がいくつかの攻撃されたパスワード間でO(N)コストを共有することを防ぎます。事前計算されたテーブル、fortiori rainbowテーブルは、もはや実現できません。

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

したがって、ソルティングは、攻撃者が事前に計算されたテーブル、特に事前に計算されたレインボーテーブルを使用することを少なくとも防ぎます。これは、攻撃者 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秒あたり数千のクライアントを持つ共有サーバーでは、総コストが非常に高くなる場合があります。概念的には、正当なユーザーと攻撃者が同じ要因で基準を引き上げることは、最終的には優れたセキュリティではありません。しかし、特定の状況では、それは価値のあるアイデアになる可能性があります。

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

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

通常、パスワードのセキュリティのために、攻撃者にオフライン攻撃を構築させないようにシステムを構成することは、はるかに効果的です。これがUnixシステムの機能です。これまで世界中で読み取り可能な/etc/passwordファイルにあったハッシュ化されたパスワード/etc/shadowは、いくつかの特権アプリケーションを除いて、読み取りアクセスから保護されたファイルに含まれています。ここでの仮定は、攻撃者がを読み取れる場合、/etc/shadowおそらくシステムを十分に制御できているため、パスワードを必要としなくなっているということです...


5
すばらしい答えです。私が同意しない唯一のビットは、「概念的には、正当なユーザーと同じ要因でレベルを上げると、攻撃者は最終的に優れたセキュリティではない」-攻撃者はユーザーが実行する必要のある操作を多数実行する必要がある ユーザーログインに1クロックサイクルを追加すると、攻撃者に数百万が追加されます。
ニックジョンソン、

1
@Thomasこれは正確なままであり、おそらくいつまでも予測不可能な将来にわたって正確なままです。一般的なパスワードの品質が低いため、ハッカーはあらゆる種類のハッシュを通じて実際のパスワードを推測できます。「123456」を推測すると、常にいくつかのヒットが得られます。これは、使用するパスワードストレージに関係なく当てはまります。
tylerl 2013

1
私の意見ですが、強力なパスワード暗号化がすでに広く利用されているのに、なぜSHA1を使用するのでしょうか。1年前、MD5は「安全」と考えられていましたが、現在はそうではありません。SHA1でも、いつでも同じことが起こり得ます。個人的には、私はこの時点からBlowfishに賭けるつもりです-それはより良い担当者と暗号コミュニティの関係専門家が少ないようです、それはほとんどどこでも利用できるので、SHA1でギャンブルする理由はありません。
mindplay.dk 2013年

1
MD5はパスワードストレージに対して安全であるという@ThomasPorninからの回答に迷い込んでいることに、私は私のコアにショックを受けています。MD5が問題ないのに、なぜEVERYTHINGはそれを使用しないと言うのに、bcryptを使用するのですか?彼らは用心深いですか?私はすべてを読んで理解しましたが、MD5はブルートフォースに対して脆弱であるため、非常に悪い印象を受けました。最近1年前のコメントは回答に矛盾していません...
temporary_user_name

1
@Aerovistae:security.SEサイトでその回答を確認することをお勧めします。これには、パスワードハッシュに関する分析と最近の詳細が含まれています。
Thomas Pornin

30

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

bcryptやscryptなどの最新のパスワードハッシュアルゴリズムは、メモリ要件がはるかに高いブロック暗号であり、GPUでのメモリアクセスを同じ程度に並列化することはできないため、GPUでの実行が困難になるように特別に設計されています。彼らはまた、技術が向上するにつれてそれらをその場で遅くすることを可能にする「仕事関数」を持っています。

つまり、作業に最適なツールのみを使用する必要があります。また、SHA-1は最先端の技術にはほど遠いものです。

さらに読むために:


2
「bcryptやPBKDF2などの最新のパスワードハッシュアルゴリズムは、GPUでの実行が困難になるように特別に設計されています」 -「bcryptまたはscrypt」という意味ですか?PBKDF2は単に反復ハッシュであり、GPUにとって問題となるものは何もありません。
Tgr

4
使用しているGPUを教えてください。同じものを購入します。「分」で2 ^ 160のSHA-1計算を実行できる場合(「時間」より短いため、最大59分)、毎秒10 ^ 44を超えるパフォーマンスを実現できる必要があります。PCIe転送の上限は約128GT / sであるため、GPUには素晴らしいオンボードメモリも必要です。私はそれがほしい。
デイモン

3
@Damon:ユーザーが「簡単な」パスワード(8ビット未満のエントロピー)または「解読不能」なパスワード(> 60ビットのエントロピー)を持っていると想定しているようです。パスワードエントロピーが10〜60ビットの範囲にあるすべての人を完全に無視しています。これらは、bcrypt、レインボーテーブル、GPUを使用するユーザーであり、通常、一般的なユーザーベースの約80%を占めます。
jammycakes

1
(おっと...「bcrypt、rainbowテーブル、GPUが最も大きな違いをもたらすのは、これらのユーザーです」)
jammycakes

3
一部の統計と分析については、troyhunt.com / 2011/06 / brief - sony - password - analysis.htmlを参照してください。ユーザーの36%がパスワードディクショナリに表示されるパスワードを選択していますが、最も一般的なものを選択しているのは2〜3%だけです。
jammycakes

7

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

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

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


何千回も繰り返すのは、あなたが考えるほど良いアイデアではありません。ハッシュの衝突のリスクが高まります。yorickpeterse.com/articles/use-bcrypt-fool
jammycakes 2012

1
その記事は完全に混乱しているように見えます。安全なハッシュ関数は、反復ハッシュによってかなりのエントロピーを失うことはありません。反復ハッシュは、PBKDF2やscryptなどのキーストレッチスキームのコアコンポーネントです。著者が推奨するbcryptでも、同様の構成を使用しています。彼の「攻撃」はハッシュのプリイメージを見つけることに依存しています。その場合、そのハッシュを使用するほとんどの構造はとにかく完全に破壊されます。最後に、反復ハッシュを直接使用することはお勧めしません。私の質問で言うように、目的のために設計された既存のプリミティブを使用する必要があります。
ニックジョンソン

7

SHA1はメッセージダイジェストであり、パスワードハッシュ(またはキー派生)機能を意図したものではありません。(ただし、HMAC-SHA1を備えたPBKDF2のように、KDFのビルディングブロックとして使用できます。)

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

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

場合Argon2が利用できない、唯一の他の標準化されたパスワード・ハッシュやキー導出関数は、PBKDF2やや古いNISTの標準です、。標準を使用する必要がない場合は、bcryptおよびscryptを選択できます。

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


4

SHA-1に、ブルートフォースよりもはるかに高速に検索できる重大な脆弱性が発見されました。それは依然として大部分は扱いにくいですが、それが長すぎる場合には当てはまりません。偏執狂的なプログラマーは、SHA-2ファミリーの何かを好みます。

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

「火の出口まで歩くのですが、走るのではありません。煙は見えませんが、火災警報器は作動しています。」

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

要するに、SHA-1は現在安全であり、おそらくしばらくは来るでしょうが、暗号化コミュニティは予後に関して不快です。


リンクを提供していただけませんか?言ったように、私が見つけることができる最高のプリイメージ攻撃は、検索をなんと8倍速くし、それが機能するためにも、SHA-1の半分のステップを省略する必要があります。(また、これは2番目のプリイメージ攻撃であり、パスワードハッシュには役に立たないと
思い

最近のニュースに照らして、私はNSAからの何かにも懐疑的です:)
Alex W

4

2017年2月以降、SHA-1は安全であると見なされなくなります。グーグルは、丸められていない完全なSHA-1に対する衝突攻撃の成功を報告しています(レポートへのリンク)。Googleの発表については、ここをクリックしてください

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


OK、SHA-1コリジョンを見つけるのに約6,500 CPU年と100 GPU年かかりました。これは本番攻撃ではありません。パスワードを解読することは、すべての可能な入力に対する総当たりではなく、10,000,000の頻繁なパスワードのリストに対する総当たりです。こちらが論文です。
zaph 2017

1
この欠陥は、パスワードを保護するためにハッシュ関数のみを使用しています。ハッシュ関数を使用するだけでは不十分であり、ソルトを追加するだけではセキュリティが向上しません。暗号化ハッシュは非常に高速です。代わりに、ランダムなソルトを使用してHMACを約100ミリ秒繰り返し、ハッシュを使用してソルトを保存します。などの使用機能PBKDF2(別名Rfc2898DeriveBytes)、password_hash/ password_verifyBcryptおよび同様の機能。ポイントは、攻撃者がブルートフォースでパスワードを見つけるのに多くの時間を費やすようにすることです。ユーザーの保護は重要です。安全なパスワードを使用してください。
zaph 2017

衝突はプリイメージではなく、パスワードは署名ではありません。衝突攻撃は元の平文の知識を必要とするため、パスワードに対しては機能しません。
Tgr

Tgr:同意しました、ありがとうございます。Zaph:はい、レインボーアタックから保護するためのソルトと低速の暗号ハッシュの使用は、この回答では特に取り上げなかった推奨プラクティスの1つです。
アーロン

3

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

NISTの発言次のとおりです。

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


それは2004年からのNISTコメントです。彼らの2010年草案勧告は、SHA-1が2010
。– Tgr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.