web-dev-qa-db-ja.com

「本物の」塩と「偽の」塩

今年のDEFCONでのQ&A期間中に、聴衆の1人のメンバーが、ハッシュする前にランダムな値とパスワードを連結するときに「偽の塩」を使用していると述べました。彼は、「実際のソルト」を、アルゴリズムの実行方法を変更する元のUnix crypt実装に見られるものとして定義しました。そのため、各パスワードを解読するために異なるコードを使用する必要があり、GPU攻撃を非常に厄介にしました。

「本物」と「偽物」の塩の議論にメリットはありますか?

45
Jeff Ferland

区別は任意です。ソルト認識アルゴリズムは、入力データを受け取り、それをさまざまな方法でスクランブルすることによって機能します。他のものより多少「偽物」であるソルトを挿入する方法はありません。

汎用CPUでは効率的であるが、GPU(またはカスタムFPGAまたはASIC)では適切にスケーリングされないパスワード処理アルゴリズムを考案しようとしているis実際の研究トピック。これが scrypt に関するものであり、間違いなく bcrypt はすでにうまく機能しています。ここでの考え方は、常に変更されるテーブルでアクセスを使用することです。 RAMでのテーブルアクセスは、汎用CPUが得意なものですが、GPUにとって困難です(GPUで実行できますが、通常はGPUで得られるほどの完全な並列性ではありません) )。

46
Thomas Pornin

はい、描画する有効な違いがあります。違いがどれほど有意義であるかを伝えるには、暗号学者が必要です。

あなたが説明した「本当の塩」は、「暗号化アルゴリズムを混乱させる」ために使用されます。私は漠然とそれを理解していますが、適切に説明するには十分ではありません。実際のソルトではoriginalパスワードテキストが暗号化されますが、アルゴリズムがソルト入力を組み込む方法に応じて出力が異なります(アルゴリズムにはソルトと(少なくとも2つの)入力があります)。 (別途)元のパスワードテキスト)。

「偽のソルト」では、暗号アルゴリズムで暗号化する前に、元のパスワードテキストをソルトで変更します。たとえば、私のパスワードが "nezperce"で、私のソルトが "qp"の場合、アルゴリズムは変更パスワードテキスト "qpnezperce"を渡してエンコードします。アリスもパスワード「nezperce」を使用しようとしたが、ソルト「w4」がある場合、アルゴリズムは変更済みパスワードテキスト「w4nezperce」をエンコードします。結果として、同じパスワードを使用していても、彼女の暗号化されたハッシュは私のものとは異なります。

どちらの方法も、塩の主な利点を提供します。同じパスワードが常に同じ方法で暗号化されないようにするため。ソルトを使用すると、事前に計算されたハッシュ攻撃(以前は辞書またはブルートフォース攻撃と言っていました。コメントを参照)の実装が難しくなります。

計算オーバーヘッドの増加(これにより攻撃が遅くなる)など、「実際のソルト」を使用することには他にも利点があると思います。しかし、繰り返しますが、それが本当かどうかを知るには、私よりも暗号スキルの高い人が必要です。

「偽のソルト」の利点は、実装が簡単で、暗号に精通する必要が少ないことです。私が最も頻繁に偽の塩を見た場所は、独自の認証データベースを管理するWebアプリケーションであることを知っています。

21
gowenfawr

Thomasが指摘したように、ハッシュアルゴリズムの修正としてソルトを適用するだけの一般的な概念では、基本的に、追加の保護は得られません。攻撃者が既存のソフトウェアやハードウェアの攻撃に適応することを要求する可能性がありますが、自分が何をしているのか本当にわからない場合、問題が発生する可能性もあります。

しかし、彼らは塩漬けに関する最初の論文の他の古い革新を見逃しました-通常「ペッパー」と呼ばれるもの:実装の一部であり、パスワードとともに保存されないカスタムキー。 MorrisとThompsonがその概念を導入した方法を、彼らの独創的なUnix論文 Password Hashing add salt + pepper or is salt is十分ですか?

コショウには、ソルトと組み合わせて使用​​できるという利点があります。そのため、誰かがパスワードデータベース(ソルトを持っている)を盗んだとしても、コショウを盗む必要があります(おそらくアプリケーションまたはハッシュに組み込まれています)。ライブラリコードまたは完全に別のシステムに格納されている)パスワードをクラックする。多くの場合、それはそれほど難しくありませんが、場合によっては、かなり難しくなることがあります。

7
nealmcb

オリジナルのUnix crypt実装の詳細に精通していません。しかし、それは私には本当に意味をなさないようです。特に、最初にパスワードをソルトする目的が何であるかを検討します。ソルトを使用すると、アルゴリズムが「より強く」なるように変更された場合、最初に間違ったアルゴリズムを使用していると思います。

5
M15K

私も講演に参加しており、講演中に両方の暗号技術者と座りました。偽の塩と比べて本当の塩は本当に興味をそそられました。目の前にメモがないので許してください。しかし、偽の塩と比較して、真の塩の安全性には大きな違いがあります。真のソルトは、ブロック暗号に入るときにキーを変更します。したがって、平文(パスワード)だけでなく、反復がどのように行われるかを決定するためのキーも一意です。これで、偽のソルトはプレーンテキスト(パスワード)を変更するだけで、キーは同じままです。アルゴリズムを調整することで、真のソルトは偽のソルトよりも指数関数的にクラックしにくくなります。

例を使用してこれを説明しましょう。この例では、真のソルトと偽のソルトの両方でMD5ハッシュを使用します(MD5で真のソルトを使用できるかどうか覚えていません。ここで、CUDA-MultiforcerをGPUパスワードクラッカーとして使用しているとしましょう。標準のMD5に対して実行してパスワードを解読するように設定しましたが、パスワードをソルトしたため、ソルト(trueまたはfake)に基づいて永久に実行できました。ここで私に与えられた説明の一部は、偽の塩をクラックする機能と、ハッシュを分割して計算/クラックするのに少し時間がかかった方法でした。私は彼らが言っていることを守らなかったので、それで私はかなりベースから外れることができました。ここで、パスワードソルトを取得できたと仮定します(偽物に該当)。偽の塩を使用して、それをパスワードクラッカーに入力し、ハッシュを一致させるまでブルートフォースを続けます。実行はそれほど難しくなく、かなり高速に実行されます。

今、私たちが本当の塩を使用している場合、それは指数関数的により困難であり、ハッシュをクラックするのにより長くかかります。真のソルトを使用する場合、使用されていた特定のアルゴリズムで真のソルトを使用するには、CUDA-Multiforcerの一部を実際に書き換える必要があります。これは暗号のキーを変更することを覚えておいてください。つまり、単純なテキストの変更ではなく、アルゴリズムの変更なので、コードを変更してこれを行う必要があります。では、パスワードクラッカーの実行方法を変更しました。これで、速度の問題が発生しました。キーを変更すると、ブルートフォースパスワードごとに使用する反復が変更されるため、各パスワードのテストにかなり時間がかかります。彼らは両方とも速度の違いのいくつかの例を私に与えてくれました、そして私は偽の塩でそれは毎秒約100万でした、そして本当の塩は約だったと思います

3
GuloGulo

偽のソルトと実際のソルトの違いは、ハッシュアルゴリズムが攻撃者に隠されている場合にのみ異なります。オープンスタンダードのハッシュアルゴでハッシュアルゴのバリエーションを決定する「実際のソルト」は、GPU /分散型攻撃によって簡単に実装されます。これは、すべての入力が攻撃者に知られているため、サブアルゴを前もって簡単に決定できるためです。時間。

パスワードの初期のUnixハッシュアルゴ(Bell System V7で思い出したように)は、パスワードハッシュのアルゴを提供していませんでした。これは、.oファイルしか取得できないシステムの唯一の部分でした。その他すべてのソースコードを取得できます。

2
Soren