web-dev-qa-db-ja.com

ハッシュからパスワードの長さを検出することは可能ですか?パスワードを2倍にすると、セキュリティが向上しますか?

サービスにプレーンテキストのパスワードが格納されていない場合、この質問に対する回答はサービスに依存すると言ってもいいでしょうか。悪いサービスでは、ハッシュの長さはパスワードの長さに関連しています。良いサービスでは、それらは無関係です。それは私の推測です。

また、パスワードを2倍にすると、セキュリティはどの程度向上しますか? passwordを使用する代わりに、passwordpasswordを使用するのはどうですか?

私は専門家ではないので、わかりやすい説明を歓迎します。

6
superuser

ハッシュの長さが入力によって異なる場合は、ハッシュではありません。 暗号化ハッシュ関数 は、入力に関係なく、固定サイズの出力を提供します。たとえば、SHA-256は常に256ビットの出力を提供します。決して多かれ少なかれ。

パスワードハッシュは、このサイトでよく議論される特定のアクティビティです。短い答えは bcryptを使用 です。細かいディテールを適切に処理します-そしてたくさんあります。

パスワードを「2倍にする」ことについては、実行するかしないかを選択できる場合にのみセキュリティが追加されるため、可能なパスワードのスペースのサイズが2倍になります。体系的に行うと、いいえ、セキュリティは向上しません。また、パスワードの長さが漏洩する可能性があります(たとえば、パスワードを入力すると、オフィスの同僚はキーストロークの数を簡単に聞くことができます)。

パスワードの強さは、長さ、特殊文字、またはその他の従来の規則に由来するものではありません。 パスワードは、異なっていた可能性と同じくらい強力ですパスワードの可能な値の数(パスワードを生成するためのメソッドを指定した場合)が重要なパラメーターです。ここで「機知に富んだ」ことは何でも悪い考えです。攻撃者が常にあなたと同じくらい賢いと想定しなければならないことを忘れないでください。したがって、「攻撃者は決してを考えない!」という考えでパスワードを作成しようとしないでください。攻撃者はあなたの前にすでにそれを考えていました。

適切なパスワードがランダムに生成されます。サイコロ、コイン投げ、番号付きのエリアに分割された板の上で猫がおもちゃのマウスを追います。または、コンピューターが実行されている場合は、それに到達します 乱数ジェネレータ

20
Thomas Pornin

完璧な世界では、トーマスポルニンは完全に正しいです。固定出力長は、コンテンツの長さを含めるために、コンテンツを完全に難読化する必要があります。

ただし、コンテンツの長さなどの情報を明らかにできるさまざまなタイプの暗号解読に身をさらすハッシュユーティリティの例があります。これの最も注目すべき例は、もちろん、NTLMv1「ハッシュ」です。数学の一時的な渦の亀裂のため、値が8文字より短い場合、NT LanMan v1ハッシュは残りの入力ストリームを埋めて、ハッシュの2番目のブロックの一貫した出力値を生成します。文字通り、8文字未満のパスワードがある場合、一貫した2番目のブロック「0xAAD3B435B51404EE」を取得します。 LANMANのセキュリティに関するWeb検索だけを読んで、古き良き「フェイスパーム」に興味がある場合。良い時間。

したがって、ここで重要なことは次のとおりです。はい、ハッシュシステムshouldは常に異なる入力に対して一意の出力を提供し、-決してすべきではない提供any情報そのハッシュを生成するために使用されるコンテンツについて。ただし、開発者またはセキュリティ研究者は、すべての暗号化/ハッシュシステム/アルゴリズムを調査して、それらがセキュリティ目標に準拠していることを確認する責任もあります。

8
grauwulf

暗号化ハッシュ関数 は固定長の出力を提供し、入力と「相関」しません(「閉じる入力」の「閉じる出力」を取得しません。入力すると、出力はすべてスクランブルされます)。

したがって、攻撃者がハッシュからパスワードの長さを取得する唯一の方法は、最後のビットに正確な実際のパスワード自体を取得することです。

パスワードに十分なエントロピーがあり(可能なパスワード値の十分大きいセットからランダムに選択された)、ハッシュ関数が 十分 である場合、攻撃者が-無視できる確率。

(もちろん、同僚やルームメイトは、パスワードを入力するときに単に注意を払うことができます。彼らが出す音からキーストロークを数えることはそれほど難しくありません...)

4
Thomas Pornin

深刻なハッシュスキームでは、ハッシュのサイズは一定であり、より一般的にはハッシュの値は検出可能な方法でパスワードに依存しません。ハッシュのサイズがパスワードに依存している場合、ハッシュスキームは完全に壊れています。おそらくハッシュではなく、暗号化(つまり、可逆的なもの)です。

パスワードを2倍にするとセキュリティが向上するかどうかは、攻撃者に依存します。攻撃者がハッシュからパスワードを見つけようとしていることを考えていると思います(攻撃者がキーロガーからパスワードを取得した場合、明らかに違いはありません)。攻撃者が長さの長い順にパスワードを試行する場合、パスワードを2倍にすることでパスワードの耐性が大幅に向上しますが、それほど愚かな攻撃者はほとんどいません。攻撃者がハッシュをリバースしようとするときにパスワードの妥当な一般的な分布を使用している場合、パスワードを2倍にしてもそれほど多くはありません。攻撃者があなたを標的にしていて、パスワードを2倍にしたことがわかっている場合、2倍にしても意味がありません。

パスワード選択スキームが攻撃者にもたらす作業量を定量化する方法があります。どのパスワードを選択したかを攻撃者が知る方法がなく、可能なパスワードの数を数えます。これをパスワードのエントロピーといいます。コインを裏返してパスワードを2倍にするかどうかを決定する場合、攻撃者は2倍にしたかどうかを知る方法がないため、2倍の作業(1エントロピーのビット)がかかります。

平均して半分を入力する必要がある(2倍入力する確率が50%の確率)ことは、攻撃者の作業を2倍にするだけでは適切な投資ではありません。代わりに、パスワードの最後に別のランダムな文字を追加した場合、攻撃者の作業に26を掛けます。これは、約4.7ビットのエントロピーです。コインをひっくり返して、パスワードの最後にabのどちらを追加するかを決定する場合、エントロピーが1ビット追加され、入力する文字が1つだけ追加されます。

また、攻撃者がパスワードについての部分的な情報を持っている場合(たとえば、入力の観察または聞き取りから)、長さはその情報の一部である可能性があります。したがって、このシナリオでは、2倍にしてもセキュリティはありません。固定長のパスワード選択スキームはより堅牢です。

Thomasが言ったように、真の適切な暗号化ハッシュ関数は、パスワードに関する情報を漏らしてはなりません。これにはいくつかの原因があります:

  • 固定長の出力:ハッシュ出力は、パスワードの長さに関係なく、常に一定の長さ(アルゴリズムによって異なります)になります。
  • 一意の異なる出力:パスワードを変更すると、出力に大幅な変更が加えられ、2つの非常に類似したパスワード(つまり、「password1」と「password2」)は、ハッシュ後は似ていません。
  • 一意のユーザーごとのソルト:各ユーザーに固有のハッシュ関数で追加された要素が使用され、2人のユーザーが同じパスワードを選択すると、同じパスワードハッシュを持っていません。

私のコメントで述べられ、そしてgrawulfの回答に含まれているように、これらの原則に違反するハッシュ関数の例が歴史的にありました。おそらく最もよく知られているこの例は [〜#〜] lanman [〜#〜] (別名:LMハッシュ、またはLAN Managerハッシュ)です。このハッシュ関数は、NT以前のバージョンのWindowsで使用されていましたが、最新バージョンの下位互換性のために(デフォルトでは無効になっていますが)含まれています。

LANMANの問題はたくさんありますが、それらのほとんどは [〜#〜] des [〜#〜] の使用に根ざしています-特にユーザーのパスワードの長さを推測できる部分。 DESは56ビットのキー長に制限されており、7バイトに変換されます。またはASCII文字です。もちろん、これは、 NT日。適度に強力なパスワードとしては小さすぎます。

したがって、Microsoftの回避策は、ユーザーのパスワードを半分に分割し、それぞれを個別にハッシュしてから、ハッシュ文字列を貼り合わせて最終的なLMハッシュを作成することでした。これにより、ユーザーは最大14文字のパスワードを作成できます。 14文字より短いパスワードの場合、DESキーの残りの部分を埋めるために、パスワードを分割する前に)末尾にヌル文字のパディングが追加されます。もちろんつまり、7文字より短いすべてのパスワードは、ハッシュの後半(すべてnull文字として開始され、ソルトなしでハッシュされたもの)が7文字より短い他のすべてのパスワードと同一になるということです。

マイクロソフトがユーザーごとのソルトを使用していた場合、少なくともハッシュ出力からユーザーのパスワードの長さを簡単に推測することはできませんでした。それはまた、辞書攻撃をかなり困難にしたでしょう。ただし、関数には他にも固有の弱点があり(この質問の範囲を超えて)、今日の世界での使用には完全に不適切です。

最新の暗号化機能はこれよりもはるかに強力でスマートであるため、パスワードの長さに関する特定のデータが漏洩する可能性ははるかに低くなります。ただし、notをハッシュする方法の例として、この歴史的な詳細を覚えておくことは良いことですパスワード。 (もちろん、とにかく独自の暗号を導入することは決して良い考えではありません。)


ヒント:Vista以降、LANMANを使用したパスワードのハッシュはデフォルトで無効になっていますが、下位互換性を保つために引き続き使用できる機能です。 Windowsパスワードができないことを確認したい場合(---)、したがっては、どのWindowsシステムでもLMハッシュとして処理されませんシステム管理者がパスワードを設定する方法については、パスワードが15文字以上であることを確認してください。

2
Iszi

簡単な例。私のハッシュアルゴリズムは次のように動作します。数Nが与えられると、その数のハッシュは次のように定義されます

HASH(N)=N%100.

入力ハッシュとして123を指定した場合、23は123%100になります。入力として2365736を指定した場合、ハッシュは36になります。入力が123867823の場合、ハッシュは23になります。ここで質問です。ハッシュ値として23が指定されている場合、その入力値を確認できますか?完璧な値を言うことはできません。

123と175623の両方のハッシュとして23である重複値が生成されるため、ハッシュ関数はこれとまったく同じではありません。このように、ハッシュ関数は元に戻せません。

0
sujeesh

エントロピー(またはランダム性)と呼ばれる概念が鍵です。ブルートフォース攻撃は、関与する最低レベルのエントロピーを満たす必要があるだけです。一般的に、よくハッシュされたパスワードは、平均的なパスワードよりも高いエントロピーを持つ長さになります。ハッシュに対する衝突を探すこ​​とは可能ですが、使用するパスワードがハッシュ自体よりもエントロピーが少ない場合は、パスワードを推測して推測する方が簡単です。

たとえば、私のパスワード123がa3afj93a93ufa9f9uafnmacにハッシュされる場合、私のパスワードが類似またはより大きなエントロピー(またはランダム性)を持っている場合よりも、ハッシュを試行するための推測がはるかに少なくなります。エントロピーの低いパスワードのハッシュを計算して一致を探すことで適切に保護されていない場合、レインボーテーブルと呼ばれる攻撃を同時に多数のハッシュに対して使用できます。ソルトの概念は、パスワードの先頭にランダムな値を追加することにより、ハッシュ前にパスワードのエントロピーを増やします。これにより、攻撃者がハッシュテーブルにアクセスできる場合でも、各パスワードを個別に攻撃する必要があります。

0
AJ Henderson