web-dev-qa-db-ja.com

ブルートフォースよりも効率的な方法を使用して、ハッシュとソルトが与えられたパスワードをクラックする方法は?

私は、ブルートフォースを使用することで、その塩とハッシュを考えると、パスワードを解読することができました。

そもそも、パスワードの長さは3、ソルトの長さは2でした。

例:、ハッシュ:rrVo/xC.s5/hQ、salt:rr =>パスワード:thr(時間:〜0m4.579s)

ここで、長さが4でソルトの長さが2のパスワードの場合:

例:、ハッシュ:ss1C5xfz6Nggg、salt:ss =>パスワード:four(時間:〜7m19.531s)

すでに述べたように、これらのパスワードはブルートフォースアルゴリズムを使用して取得されました。パスワードの長さが短い場合に役立ちます。パスワードの文字数が増えると、パスワードを破るのに必要な時間が指数関数的に増加します。

知りたいのは、検索スペースを削減するためのより効率的な手法です。

追加情報:

  1. パスワードは、A-Z、a-z、0-9、および記号:$、#、+、@、=、/、&を使用して作成されます。

  2. opensslコマンドを使用してハッシュを生成し、与えられたハッシュと比較しました

    $ openssl passwd -crypt -salt rr thr
    

bashスクリプトで。

20
InfZero

これ以上の情報がないと、検索スペースを減らすことはできません。パスワードに関する事前の情報がないため、検索スペースから考えられるパスワードを除外することはできません。

ハッシュ関数(指定しない)にいくつかの脆弱性がある場合、ブルートフォース攻撃を開始する前にパスワードについて何かを知ることができる場合があります( 'a'で始まり、 'b'を含むなど...) 。したがって、検索スペースを削減します。

より高速なパスワードクラッキングのニーズに答える可能性のある他の何かは Rainbow Tables です。これは、saltを指定して実行する事前計算であり、後でパスワードをより早く見つけることができます。レインボーテーブルは、特定のハッシュのルックアップテーブルとして使用されます。

hash('four','ss') = ss1C5xfz6Ngggがあり、塩ssを知っているとします。次の事前計算を実行します。

Precomputation Rainbow Table 高速ルックアップを有効にするには、実際のRainbow Tableをハッシュ値に従ってソートする必要があります。このように、パスワードのハッシュが与えられると、ss1C5xfz6Nggg、Rainbow Tableでハッシュを検索するだけで、パスワードはそのすぐ隣に保存されます。したがって、クラッキングプロセスをはるかに高速化します(もちろん、事前計算時間を犠牲にします)。

編集:Sjeord のコメントは正しいため、次の点を指摘する必要があります。

レインボーテーブルは、ブログ投稿の主題として最近人気を博しているにもかかわらず、優雅に熟成していません。パスワードクラッカーのCUDA/OpenCL実装は、GPUで利用可能な大量の並列処理を活用して、1秒あたり数十億の候補パスワードをピークにできます。文字通り、7文字以下のすべての小文字のアルファベットパスワードを2秒未満でテストできます。そして、これを可能にするハードウェアをレンタルして、3ドル未満の時間でこれを実現できます。 1時間あたり約300ドルで、1秒間に約500,000,000,000個の候補パスワードを解読できます。

ソース

25
MiaoHatola

ブルートフォースよりも速くパスワードを取得する方法はありませんが、ブルートフォースの速度については、変更できることがたくさんあります。

4(時間:〜7m19.531s)

これは、この短いパスワードをブルートフォースにするのに長い時間です。まともなグラフィックカードで hashcat を使用すると、パフォーマンスが大幅に向上します。次のコマンドで2秒未満でクラックできます。

/usr/src/cudaHashcat-2.01/cudaHashcat64.bin ss1C5xfz6Nggg -m 1500 -a 3
19
Sjoerd

Salt + hashシステムの全体的な目的は、ブルートフォース攻撃よりも速くてはならないということです。 BgrWorkerがすでに指摘したように、実際には古いハッシュアルゴリズムには弱点があり、検索スペースを削減します(より正確には、衝突の計算を許可します)。しかし、発見することは、スタックオーバーフローの答え。 :-)

使用できるいくつかの一般的なトリックがあります:

レインボーテーブルについては既に説明しましたが、ソルトサイズによっては、実際のハッシュとパスワードの長さについても、上位100個程度のパスワードへの可能なアプローチを提供します。

馬鹿な力の代わりに辞書攻撃とクラッカーを使う。パスワードaaaaaaaaは、パスワード「password」または「12345678」よりも可能性が低いため、最初にテストするのが賢明です。

最後に、多くの実際のシナリオでは、サイトまたは企業のパスワードポリシーにより、検索スペースが実際に大幅に削減されることがあります。パスワードが可能であるだけでなくhaveに、たとえば少なくとも1つの数字と1つの特殊文字を含める場合、8文字の検索スペースが10 ^ 15から10 ^ 13に減少しました。

9
Tom

あなたの問題は、bashスクリプトでopensslを使用していることだと思います。つまり、新しいパスワードを入力するたびに、別のプロセスが起動される必要があります。総当たりの場合は、Cなどの効率的なコンパイル済みプログラミング言語の使用を検討してください。効率が1桁以上向上することは間違いありません。

もちろん、これはブルートフォースアプリケーション全体を書き直す必要があることを意味します。

4
juhist

あなたが求めているのは、一般的なパスワードハッシュアルゴリズムの基本的な目標に直接反対しています。あなたが求めることは難しいことに驚かないでください。人々は何千時間も費やしてあなたを困難にしています。

人々はRainbow Tablesやその他のパスワードハッシュアプ​​ローチについて言及していますが、これはあなたがしていることの論理的な拡張となるでしょう。他の選択肢は、人々が通常完全にランダムなパスワードを選択しないという事実を利用することです。 John the Ripperのようなソフトウェアは、これを悪用するように設計されており、一般的なパスワード生成スキームを使用して、可能性の高いパスワードを最初に推測します。これは、パスワードが適切に選択された場合にのみ、ブルートフォース検索に頼る必要があることを意味します。

2
Cort Ammon