2016-09-15 5 views
1

現在、MD5ハッシュに対してブルートフォース攻撃を行うJavaアプリケーションを作成しています。私はuseハッシュ入力を取るJFrameを作った。例えばスレッドから別のクラスに値を返す方法

Picture 1

私はMD5に言葉 "パスワード" をハッシュ化されました。 JButtonがクリックされると(図1)、 ハッシュを比較クラスに送信します。比較クラスはすべての可能性を順番に繰り返します。 IEはAAAAAAAAから移動します。次にAAAAAAABなどに送信します。それらをハッシュします。可能性のハッシュが単語 "パスワード"のハッシュと一致した場合。一致が見つかったことをユーザーに知らせるダイアログボックスが表示されます。

私の問題は、setterとgettersを使わずにimplements RunnableのGUIクラスにあるスレッドの値を返す方法がわかりません。

public void actionPerformed(ActionEvent e) 
{ 
    if(e.getSource().equals(bruteForceButton)) 
    { 
     enterLabel.setText("Brute force in process"); 

     String enteredHash = input.getText(); 
     int lengthOfPass = (int) length.getSelectedItem(); 

     //Send the information to the comparative class 
     HashComparative comp = new HashComparative(); 
     comp.setHash(enteredHash); 
     comp.setLengthOfPass(lengthOfPass); 
     Thread t1 = new Thread(comp); 

     t1.start(); 
     hash.setText(comp.getHash()); 
    } 

これは、適切なデータを比較クラスに送信するスレッドを開始します。 そしてもう一つのクラスがあります。

public class HashComparative implements Runnable 
{ 

    private String h; 
    private int l; 
    private Thread thread; 


    public void start() 
    { 
     thread = new Thread(this, ""); 
     thread.start(); 
    } 
    @Override 
    public void run() 
    { 
     try 
     { 
      //CODE WILL GO HERE TO COMPUTE HASHES 

      setHash(h); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public void setHash(String h) 
    { 
     this.h = h; 
    } 
    //Returns the hash currently being compared 
    public String getHash() 
    { 
     return h; 
    } 
} 

ブルートフォースが動作している間。ハッシュ文字列をGUIクラスに送り返してテキストをJLabelに設定することで、表示しようとするハッシュを表示したい。例

Picture 2

のために私はオンライン見てきましたが、これに対する答えを見つけることができません。どんな助けがありがとう

+3

'ExecutorService'を使用し、' Callable'の代わりを実装する複数のスレッドによって変更してアクセスされるように、あなたはhvolatileを作るためにだけ必要があります。 'Runnable'です。 –

+0

少し深めてください。 –

+1

https://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html –

答えて

1

Runnableではなく、Callableの代わりにCallableが必要です。このインターフェイスでは、ここで必要な値を返すことができます。 RunnableThreadにのみ提供できるので、代わりにExecutorsから作成できるプールスレッドを使用する必要があります。 submitタスクをCallableまたはRunnableとして許可し、タスクが正常に完了するまで待つことができるようにFutureを取得します。あなたはExecutors.newSingleThreadExecutor()

ExecutorService executor = Executors.newSingleThreadExecutor(); 
... 

を使用して唯一のスレッドのプールを作成することができますあなたの場合は

次に、あなたのクラスHashComparativeは次のようになります。

public class HashComparative implements Callable<String> { 
    private final String enteredHash; 
    private final int lengthOfPass; 

    public HashComparative(final String enteredHash, final int lengthOfPass) { 
     this.enteredHash = enteredHash; 
     this.lengthOfPass = lengthOfPass; 
    } 
    @Override 
    public String call() throws Exception { 
     //CODE WILL GO HERE TO COMPUTE HASHES 
     return h; 
    } 
    ... 
} 

そして最後に、あなたは次のようにあなたのタスクを送信します。

HashComparative comp = new HashComparative(enteredHash, lengthOfPass); 
Future<String> future = executor.submit(comp); 
hash.setText(future.get()); 

不一致ハッシュを表示するために使用できるものは何ですか?

この種のニーズに最も合致するデザインパターンはObserverです。実際にここでは、あなたのUIにあなたの計算の進捗状況を観察させたいと思っています。このパターンを実装するために使用できるObservableObserverが用意されています。

ので、ここで簡単のために、あなたはあなたのクラスHashComparativeObservers(ここではあなたのUIに)新しいハッシュが処理されている任意の時間を知らせることができるようにObservableを拡張して作ることができます。

public class HashComparative extends Observable implements Callable<String> { 

    private String h; 

    ... 

    public void setHash(String h) { 
     this.h = h; 
     setChanged(); 
     notifyObservers(); 
    } 

    public String getHash() { 
     return h; 
    } 
} 

次に、あなたのUIで、あなたはそれがあまりにも速くなった場合、あなたはまた、後に表示されるだけのハッシュを変更しScheduledExecutorServiceを使用することができObserver

final HashComparative comp = new HashComparative(enteredHash, lengthOfPass); 
comp.addObserver(new Observer() { 
    @Override 
    public void update(final Observable o, final Object arg) { 
     HashComparative hc = (HashComparative)o; 
     hash.setText(hc.getHash()); 
    } 
}); 

を実装することにより、それに応じてテキストを変更することができます所与の時間量。あなたは、例えば、次のようハッシュを更新するスレッドを1つだけ持っているExecutors.newSingleThreadScheduledExecutor()を使用して、それを作成することができます。

final HashComparative comp = new HashComparative(enteredHash, lengthOfPass); 
scheduler.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
     hash.setText(comp.getHash()); 
    } 
}, 1L, 1L, TimeUnit.SECONDS); 

これはハッシュが毎秒表示更新されます。このアプローチでは、あなたはもうObservableを拡張する必要がない、それは同時に

public class HashComparative implements Callable<String> { 

    private volatile String h; 
    ... 
} 
+0

比較しようとしているすべてのハッシュが表示されますか、タスクが完了する前に最後のハッシュが表示されますか?私は1から100までの単純なforループ印刷を使って、それがどのように動作するかをテストしようとしました。数秒後にJLabelに "100"しか表示されません。そして、繰り返しの間に 'Thread.sleep(100)'を使用したので、forループが表示されないように高速化するケースはありません。 –

+0

yesそれは結果を与えるだけです。実際には「私の問題はスレッドから値を返す方法がわからない」という答えです –

+0

私には可能な一致を返すか、一致するものが見つからなければ例外をスローする必要があります。または、Java 8を使用する場合は、Stringの代わりにOptional を返す必要があります。一致するものがある場合は値が表示されます。 –

関連する問題