私は暗号化の初心者であり、暗号化とは何かを非常に簡単な言葉で理解しようとしています。 " salt " は、いつ使用する必要があるのか、なぜ使用する必要があるのか、使用しないのかです。
非常に簡単に入手できますか明確な(初心者レベルの)説明?
トピックに関する参照を知っている場合は、それらも役立ちます。
回答
ソルトが使用される理由は、人々が同じパスワードを選択する傾向があり、ランダムではないためです。多くの使用済みパスワードは、覚えやすくするために短い実際の単語ですが、これも
ご存知かもしれませんが、パスワードは通常、クリアテキストではなくハッシュ化されています。ハッシュ関数の目的がわからない場合は、まずそれを読んでください。
攻撃者ができることは、一般的なパスワードとそれに対応するハッシュのリストを生成することです。サイトがテーブルとともに保存したハッシュを使用すると、一般的なパスワードが使用されている場合、攻撃者にパスワードが明らかになります。
salt はに追加されるだけです。パスワードハッシュ出力を一意にします 一般的なパスワードの採用。その目的は、事前計算ベースの攻撃を役に立たなくすることです。パスワードが一意のソルトで保存されている場合、ソルトされていないパスワードハッシュをターゲットにしたり、別のソルトでアカウントをターゲットにしたりする事前計算されたパスワードハッシュテーブルは、アカウントのパスワードを解読するのに役立ちません。ランダムに生成された長いソルト(
)は、グローバルに一意であることが期待されます。したがって、塩を使用してパスワードを作成できます。 -計算攻撃はまったく効果がありません。
ソルトとパスワードを組み合わせる最も簡単な方法は、単純にそれらを連結することです。つまり、保存されているハッシュ値はHash(salt||password)
です。パスワードpassword1
は、魔法のように、たとえば6$dK,3gCA%Jpassword1
になります。これは、パスワードクラッカーのテーブルにはありません。
ソルトは、ハッシュ値の横にあるデータベースのクリアに完全に保存できます。攻撃者がデータベースを入手してパスワードを見つけたいと思ったら、ソルトごとに事前に計算されたテーブルを個別に生成する必要があります。これはコストのかかる操作です。
オフラインのパスワードクラッキングを防ぐもう1つの方法は、実行することです。パスワードストレッチ、すなわち。ログインサービスやパスワードクラッカーなど、すべての人のパスワードハッシュの計算が遅くなります。パスワードを引き伸ばすために使用される1つの方法は、ハッシュ関数を何度も繰り返すこと、つまりHash(Hash(Hash(Hash…(Hash(salt||password)))…)
を保存することによって実現されます。
塩漬けに関連するもう1つの一般的なアイデアは、 pepper と呼ばれます。つまり、保存された値がHash(pepper||salt||password)
になるように、パスワードに連結された別のランダムな値です。その場合、コショウはまったく保存されません。ログインサーバーとパスワードクラッカーの両方が、未知のペッパー値を総当たり攻撃する必要があり、両者のパスワードハッシュ比較が遅くなります。
2013年から2015年までパスワードハッシュより優れたパスワードストレッチアルゴリズムを探すために、コンテストが開催されました。勝者は Argon2 アルゴリズムでした。プログラマーは、独自のアルゴリズムを実装する代わりに、Argon2 を使用することをお勧めします。
コメント
回答
暗号化された「ソルト」とは何かを理解するのを手伝ってくれませんか?
パスワードのコンテキストで作成時の「ソルト」とは、パスワードのハッシュ出力を解読しにくくするためにハッシュ関数に追加されるデータ(ランダムまたはその他)です。
いつ使用する必要がありますか?
常に。
理由使用する必要があるかどうか?
以下で説明する理由により、ハッシュ関数では常にソルト値を使用する必要があります。
一般的に人々が弱いパスワードを選択するのは事実であり、それらを表すハッシュ値がぎっしり詰まった公開されているレインボーテーブルがギガバイトあることは確かに真実です。したがって、誰かがサービスでアカウントを作成し、IDを保護するためにパスワードを選択した場合、通常、選択したパスワードは1)一般的、2)安全ではなく、3)ルックアップテーブルで相互参照できるようになります。
たとえば、MD5経由でハッシュされた場合のパスワード Nowayin1 は 6f367d65bc74b88e21fb9959487ffa3a であり、明らかに良い選択ではありません。たとえそれが大丈夫に見えるかもしれない(そしてそうではない)としても、パスワードのMD5ハッシュが開いているデータベースに現れるという事実はそれを無価値にします。
しかしそれはただ128ビットのMD5です。何かについてはどうですか? SHA1(160ビット)やWhirlpool(512ビット)のように強力ですか?
同じ問題です。
たとえば、 SHA1を使用したP @ $$ word は 1e69e0a615e8cb813812ca797d75d4f08bdc2f56 および 1qazXSW @ は 0bf7545b784665d23b9c174ca03688a405f05b048e9d6c49bfc2721a1fa872bbd6576273 >。
これらすべてのパスワード、およびそれらに似た数十億のパスワードの根本的な問題は、一般的に使用されるハッシュが一般的な知識になっているという事実です。
パスワード塩はそれを変更します。
ユーザーが選択したパスワードにランダムな値(ソルト)が追加された場合、その場合、SHA1ハッシュ 1e69e0a615e8cb813812ca797d75d4f08bdc2f56 は P @ $$ wordを表示しなくなりますレインボーテーブルのハッシュ値が一致しなくなったため、ユーザーのパスワードとして。
それほど時間はかかりません。たとえば、16ビットの小さなランダム値は、ルックアップテーブル内の各ハッシュ値の65,536個のバリアントを生成します。したがって、150億エントリのデータベースでは、ソルトを説明するために9,830億を超えるハッシュが必要になります。
つまり、ルックアップやレインボーテーブルを阻止するために、ハッシュをソルトするポイントです。 「ハッカーはレインボーテーブルを使用してパスワードを把握するのに多くの時間を浪費しないので、塩漬けのハッシュに帽子をかぶらないでください。
彼らは 5サーバー25-GPUクラスターシステム Hashcatを実行し、大文字と小文字、数字、特殊文字を含む考えられるすべての8文字のパスワードのハッシュを1秒あたり3500億回の推測で処理できます。六時間。 (そしてそれは2012年にさかのぼります。)
ハッシュの実行を遅くするキーストレッチなどの手法を使用して、そのようなハードウェアの速度を相殺し、辞書攻撃やブルートフォース攻撃を遅すぎて価値がないようにすることができます。 、しかしハードウェアはどんどん速くなっています。
UPDATE 2018:
現在のベストプラクティスには、 Argon2i (scryptよりも推奨)を使用してパスワードを安全にハッシュすることが含まれます。これは非常に復元力。 Argon2の PHP7 実装では、ソルトは内部で処理されます。
回答
これまで無視されてきた質問の一部に回答しようと思います:
使用する必要がある場合と、使用する必要がある/使用しない理由。
簡単に言うと、アマチュアとして、塩を直接処理する必要があるレベルで暗号化を使用するべきではありません。
たとえば、bcrypt
パスワードハッシュアルゴリズムは内部でソルトを使用しますが、それを使用する開発者にはその事実を公開しません。パスワードをbcrypt
(およびオプションで「レベル」を設定するパラメーター)に渡すだけです。ハッシュを生成するために必要な「CPUの労力の」)そしてハッシュを返します。パスワードが正しいかどうかを検証する必要がある場合は、パスワードと以前に生成されたハッシュの両方をbcrypt
渡します。パスワードがハッシュの生成に使用されたものであるかどうかが示されます。
ここに記載されているアドバイスを 受けず、ソルトを使用して自分のパスワードをハッシュしようとしないでください。これは低レベルの実装の詳細であり、これらの種類のものが必要なレベルで作業していることに気付いた場合は、抽象化のレベルが低すぎます。暗号化を正しく行うことは非常に困難であり、インターネットには善意の開発者が完全に安全でない自家製のパスワードハッシュスキームが散らばっています。
回答
引用「試験参照70-486ASP.NET MVC 4 Webアプリケーション(MCSD)の開発:ASP.NET MVC 4Webアプリケーションの開発」 William Penberthy著、Pearson Education、2013年9月15日:
ソルティングは、ファイルの暗号化とハッシュを強化し、解読をより困難にするプロセスです。値をハッシュまたは暗号化する前に、入力テキストの最初または最後にランダムな文字列を入力します。たとえば、パスワードのリストを解読しようとする場合、ハッカーは解読する前に、ソルトと可能なパスワード情報を考慮する必要があります。ソルトされる各値に異なるソルト値が割り当てられている場合、PAの潜在的なパスワード値のテーブルを作成する機能ssword-crackingプログラムは扱いにくくなります。
回答
塩は暗号化されたデータにアクセスするために必要な乱数とパスワード。
攻撃者がパスワードを知らず、ブルートフォース攻撃で推測しようとしている場合、攻撃者が試みるすべてのパスワード各ソルト値で試す必要があります。
したがって、1ビットソルト(0または1)の場合、これにより、この方法で暗号化を破ることが2倍困難になります。 2ビットソルトは4倍、3ビットソルトは8倍、などになります。32ビットソルトを使用する暗号化でパスワードを解読するのがどれほど難しいか想像できます!
)。これで、攻撃者があなたの記録を入手し、9文字のパスワードすべてに対してHASH(*)を事前に計算した場合、攻撃者はパスワードを回復できます。代わりにパスワードをソルトした場合は、HASH(' somesaltforyou ' || ' password1 ')は、攻撃者のレインボーテーブルには含まれません('は9文字を超えるため)。