web-dev-qa-db-ja.com

MD5ハッシュが$ 1 $から始まり、SHA-512が$ 6 $から始まるのはなぜですか?それ自体が弱点ではありませんか?

この質問をstackoverflowからこの場所に移動しました。私はそれが「意見」についての質問であるかもしれないことを知っていますが、私は個人的な意見ではなく、このようにそれを維持するための最終決定の源を探しています。

私は、ドアが存在することさえ知らないときに誰もドアを開けようとしないことを教えられてきました。最善の防御策は、ドアを隠すことです。それは古い戦争の映画で簡単に見ることができました-誰も隠れ家を光の中に閉じ込めないでしょう。それはいつも「そこには何も面白いものはない」ということを示唆する何かで覆われていました。

私はそれが同じように機能する暗号でそれを仮定します。なぜMD5によって生成されたハッシュが$ 1 $から始まり、これが最初にハッシュであるか、そしてそれがどのようなハッシュであるか(MD5)を伝えるのでしょうか。

今、私はsha512がまったく同じことをするのを見ます。それ自体が弱点ではありませんか?このようにする理由はありますか?

主な質問は次のとおりです。潜在的な敵からこれを隠すために、ハッシュを保存する前にスクランブルする必要がありますか?それが必要ないのなら、なぜですか?

あいまいさがセキュリティではないことを示唆する回答を回避するために、この図を提案します。第二次世界大戦です。パルチザンを隠しているのではないかと疑い、SSが家にやって来るというヒントを受け取ったところですが、これは事実です。彼らは逃げる時間がない。あなたはそれらを隠すことができる2つの選択肢があります-世界最高の安全で、または床の下の隠された穴で、あなたの両親でさえそれがそこにあるとは思わなかったほどよく隠されています。あなたの提案は何ですか?最高の金庫が最良の選択だと自分に納得させますか?

島に宝物が隠されているのを知っているなら、それがどの島なのか知りたいのです。さもないと、検索を開始しません。

私はまだ確信していません。これまでのところ、Chris Jester-Youngは、別のデータから同じハッシュを生成するアルゴリズムがもっとある可能性があることを示唆するときに、私に何か考えることを与えました。

7
Grzegorz

まず、 Kerckhoffsの原則 があり、これは常に望ましいものです。

暗号システムは、キー以外のシステムに関するすべてが公開知識であっても、安全でなければなりません。

この場合、パスワードはキーです。したがって、暗号システムを秘密に保つことは目標ではありません。

第二に、それらがmd5またはsha512ハッシュであることについて間違っています。 /etc/shadowに保存されている値はmd5cryptまたはsha512cryptであり、強化手順が必要です(md5またはsha512ハッシュの多くのラウンド)。

ここで、4つの選択肢がMD5crypt、sha256crypt、sha512crypt、およびbcrypt(Linuxシステムで最も人気のある選択肢)の場合、$saltsalt$(または同等のもの)で生成された4つのハッシュがすべてソルトとして生成され、パスワードがハッシュされますnot my real password

>>> import crypt
>>> crypt.crypt('not my real password','$1$saltsalt')
'$1$saltsalt$4iXfpnrgHRXkrDbPymCE4/'

>>> crypt.crypt('not my real password','$5$saltsalt')
'$5$saltsalt$E0bMpsLR71z8LIvd6p2tD4LZ984JxyD7B9lPLhq4vY7'

>>> crypt.crypt('not my real password','$6$saltsalt')
'$6$saltsalt$KnqiStSM0GULvZdkTBbiPUhoHemQ7Q06YnvuJ0PWWZbjzx3m0RCc/hCfq54Ro3fOwaJdEAliX9igT9DD2oN1u/'

>>> import bcrypt
>>> bcrypt.hashpw('not my real password', "$2a$12$saltsaltsaltsaltsalt..")
'$2a$12$saltsaltsaltsaltsalt..FW/kWpMA84AQoIE.Qg1Tk5.FKGpxBNC'

アノテーションがなくても、それぞれが使用するスキーム(md5crypt、sha256crypt、sha512crypt、bcryptはそれぞれ34、55、98、60文字(アノテーションとソルトを含むbase64エンコーディング)である)を理解するのはかなり簡単です。ハッシュを切り捨てるか、ハッシュのプロパティを変更することをお勧めします。一貫性のための注釈はセキュリティを失うことはありません。また、ユーザーのパスワードを適切に更新する方法も提供します。md5cryptが安全でなくなった場合は、ユーザーのハッシュを次のログイン時にbcryptを実行します(その後、一定期間が経過した後、md5cryptに残っているすべてのアカウントを非アクティブ化します)。または、b-crypt($ 2 $のとき)などのアルゴリズムを更新する必要がある場合 設計上の欠陥 =固定スキームが$ 2a $になったときに、欠陥のあるスキームを簡単に特定できます。

さらに悪いことに、sha512を新しい定数とラウンドキーで変更するつもりです。それは壊れることを超困難にするでしょう?いいえ、それはあなたが誤って大きな脆弱性を導入したのではないことを知るのを非常に難しくします。彼らがあなたの/ etc/shadowに到達できる場合は、おそらくログインに使用されるライブラリにも到達でき、時間の経過とともにハッシュスキームをリバースエンジニアリングできるため、強力なパスワードを破るよりもはるかに簡単になります。

繰り返しますが、sha256ハッシュに保存されている非常に強力なパスフレーズをブルートフォースする予想時間はO(2 ^ 256)です。たとえば、10億台のコンピューターがnanosecond(それぞれ、sha256の〜5000ラウンドを含みます)、それを壊すには、宇宙の年齢の300000000000000000000000(3 x 10 ^ 23)倍がかかります。また、sha512cryptを使用すると、観測可能な宇宙の〜10 ^ 80の原子のそれぞれがナノ秒ごとに10億のsha512cryptを実行した場合でも、宇宙の寿命の10 ^ 38倍がかかります。 (これは、256ビットおよび512ビット以上のエントロピーパスフレーズがあることを前提としています)。

24
dr jimbob

使用されるハッシュを不明瞭にすると、システムが正当なユーザーのパスワードを認証できなくなります。

Unixでのハッシュによるパスワード認証が最初に発明されたとき、パスワードハッシュ関数は、DES(今ではひどく古くなっています)を使用するようにハードコーディングされていました。パスワードハッシュが他の関数によって導出された場合、ハッシュの生成に使用されたアルゴリズムをシステムが認識できるようにするための識別子でなければなりません。

これは、パスワードハッシュが一方向の関数であるためです。そのような一方向の機能を逆に実行することを期待することは、ソーセージ工場を逆方向に実行し、豚が反対側に出てくることを期待するのと同じだと聞いたことがあります。したがって、システムにログインしている誰かを認証する場合、ハッシュ関数を実行して、その結果を/ etc/shadowに保存されているものと比較することしかできません。

したがって、これらの識別子は平文のままにしておく必要があります。そうしないと、間違ったハッシュ関数が使用され、ハッシュが一致せず、システムに侵入できません。

4
Mike McManus

ハッシュ実装を不明瞭にしようとすることは、実際に問題を移動するだけです

  • プロトコルによってハッシュ関数がX()であることがわかります

  • コードを見ると、ハッシュ関数がX()であることがわかります

**(または他の情報チャネル)

攻撃者がシステムを調査する方法を持っている場合、攻撃者はほぼ確実に、使用しているアルゴリズムを理解することができます。最も簡単なのは、単にコード(ソースコードまたはマシンコード)を調べることです。より複雑な方法では、タイミング測定を使用して、使用されている関数を区別します。 「隠れた人々」の例えを使用すると、私に必要なのは、いくつかの音響機器を持って歩いていくことだけです。建物に入る前に、地下の部屋があることがわかります。

聞きたくなかったのは承知していますが、現実は「あいまいさによるセキュリティ」は、今日知られている両方のアプローチ、または将来のアプローチのすべての可能なアプローチから十分にあいまいにすることができないため、必然的に失敗します。

1
Shawn C