結論:SHA-1は、プリイメージ攻撃に対して何でも安全ですが、計算は簡単です。攻撃。 (SHA-256などの後継機にも同じことが言えます。)状況によっては、計算コストが高くなるように設計されたハッシュ関数(bcryptなど)の方が適している場合があります。
「SHA-1が壊れている」などの発言を頻繁に行う人もいるので、その意味を正確に理解しようとしています。 SHA-1パスワードハッシュのデータベースがあり、攻撃者が最先端のSHA-1破壊アルゴリズムと100,000台のマシンを備えたボットネットにアクセスすると仮定します。 (10万台の家庭用コンピューターを制御できれば、1秒あたり約10 ^ 15の操作を実行できます。)
パスワードがソルトされている場合、それはどのように変わりますか?ソルティングの方法(プレフィックス、ポストフィックス、両方、またはxor-ingのようなより複雑なもの)は重要ですか?
いくつかのグーグルの後、ここに私の現在の理解があります。私が何かを誤解した場合は答えを修正してください。
要するに、SHA-1でパスワードを保存することは完全に安全に思えます。私は何か見落としてますか?
更新:Marceloは 2の2番目のプレイメージ攻撃について言及している記事を指摘しました106 操作 。 (編集:Thomasの説明 のように、この攻撃は現実のシナリオには適用されない架空の構成です。)ただし、これは、SHA-1をキー派生関数として使用する場合の危険性を示しています。一般に、衝突攻撃または2番目のプレイメージ攻撃が最終的に最初のプレイメージ攻撃に変わる可能性があると考える正当な理由はありますか?
あなたの質問に対する簡単な答えは: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回実行する必要があります。これは、いくつかの連続した最適化レイヤーとして見ることができます。
[〜#〜] 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
、その後、彼はおそらくシステムを十分に制御できるので、パスワードはもう必要ありません...
これまでの回答ではGPUについて言及していませんが、パスワードがソルトされていても、データベース全体が数日または数週間ではなく数分または数時間でブルートフォースできる程度までSHA-1ハッシュを並列化できます。
Bcryptやscryptなどの最新のパスワードハッシュアルゴリズムは、メモリ要件がはるかに高いブロック暗号であるため(GPUでのメモリアクセスを同程度に並列化することはできないため)、GPU上で実行するのが困難になるように特別に設計されています。また、技術が向上するにつれて、オンザフライで遅くすることができる「作業機能」も備えています。
つまり、仕事に最適なツールのみを使用する必要があります。そして、SHA-1は最先端技術からはほど遠いものです。
さらに読むには:
あなたの説明は、最新技術に対して正確に聞こえます。
ただし、ハッシュ関数の単一の反復を使用しないでください。少なくとも、何度も反復する必要があります(ハッシュを1000回反復すると、攻撃者の作業が1000倍になります。同じ量だけ作業が増加しますが、あなたは彼らよりもはるかに少ないパスワードハッシュを行っています)。
ただし、理想的には、 here のような既存のパスワードストレージプリミティブを使用する必要があります。
SHA1はメッセージダイジェストであり、それはneverがパスワードであることを意味していました-ハッシュ(またはキー派生)関数。 (HMAC-SHA1を使用したPBKDF2のように、KDFのビルディングブロックとして使用できます。)
パスワードハッシュ関数は、辞書攻撃とレインボーテーブルから保護する必要があります。この目標を達成するために、いくつかのアルゴリズムが設計されています。
現在、最良の選択はおそらくArgon2です。このパスワードハッシュ関数ファミリは、2015年のパスワードハッシュコンペティションで優勝しました。
Argon2が使用できない場合、他の標準化されたパスワードハッシュまたはキー派生関数はPBKDF2のみです。これは古いNISTです。標準。他の選択肢として、標準を使用する必要がない場合は、bcryptとscryptを含めます。
ウィキペディアには、これらの機能のページがあります。
SHA-1で深刻な脆弱性が発見され、ブルートフォースよりもはるかに高速に検索されます。まだほとんど手に負えませんが、それほど長い間そうなるとは予想されていません。妄想的なプログラマーは、SHA-2ファミリーの何かを好みます。
元の2005年の結果に関する この記事 から:
「今は火の出口まで歩いて走る時間です。煙は見えませんが、火災警報器は消えています。」
現在の暗号解読によりSHA-1が安全でなくなるということではなく、暗号コミュニティは、悪いニュースがすぐそこにあるのではないかと心配しています。この恐怖はSHA-2にも当てはまります。SHA-2は、はるかに大きな検索スペースではありますが、SHA-1と同じ欠陥を示すため、進行中の SHA- の探求です。
要するに、SHA-1は今のところ安全であり、おそらくしばらくは来るでしょうが、暗号コミュニティは予後に不快です。
ソルトパスワードを保存する場合、実用的な目的にはSHA-1で十分です。 SHA-2はより安全であると考えられていますが、本当に妄想的である理由がない限り、SHA-1は問題ではありません。
NIST says の内容は次のとおりです。
これまでにSHA-1で提示された結果は、そのセキュリティを疑問視していません。ただし、技術の進歩により、NISTは2010年までに、より大きく強力なハッシュ関数(SHA-224、SHA-256、SHA-384、およびSHA-512)を優先してSHA-1を段階的に廃止する予定です。