2015-11-10 15 views
9

私には分かりませんが2つの質問があります。私は一見を助けてください。ありがとう。MessageDigest.isEqual関数をJavaで使用する

  1. JavaでMessageDigest.isEqual機能を使用することは何ですか?

  2. Java SE 6 Update 17より前のバージョンでは、タイミング攻撃に対して脆弱であった理由を説明します。 Java SEの6アップデート10の実装を見てみると

答えて

7

、我々は、次を参照してください。

public static boolean isEqual(byte digesta[], byte digestb[]) { 

    if (digesta.length != digestb.length) 
     return false; 

    for (int i = 0; i < digesta.length; i++) { 
     if (digesta[i] != digestb[i]) { 
      return false; 
     } 
    } 
    return true; 
} 

私たちが見るの修正後にしながら:

public static boolean isEqual(byte[] digesta, byte[] digestb) { 
    if (digesta.length != digestb.length) { 
     return false; 
    } 

    int result = 0; 
    // time-constant comparison 
    for (int i = 0; i < digesta.length; i++) { 
     result |= digesta[i]^digestb[i]; 
    } 
    return result == 0; 
} 

古い実装はもっとあるように思われます最初の等しくないバイトが見つかったときにfalseを返すので、効率的です。しかし、それは呼び出し元がどのように似ているかをテストできるため、置き換えられたと仮定しています。 2つの入力バイト配列は、メソッドの実行時間に基づいて相互にあります。

新しい実装は、(配列の最初のバイトが異なる場合でも)配列全体を繰り返し処理するため、常に同じ実行時間(同じ長さの配列)を持ちます。

このメソッドが呼び出された場所を検索しました。 1つの例は、のcom.sun.org.apache.xml.internal.security.algorithms.implementations.IntegrityHmacクラスです。渡されたシグネチャバイト配列が、内部バイト配列と比較して有効かどうかをテストします。修正する前に、そのメソッドの実行時間を測定することによって、比較を渡すバイト配列を生成しようとすることができます(メソッドが実行されるのにかかる時間が長いほど、2つの配列の大きな接頭辞が等しいことを意味します)。

2

以下のようにWebページのリンクを参照してください。

:私は私が認証-せなければのは、特定のユーザーとのセッションクッキーと言うIDを-して、256の可能な値を計算したいかのメッセージを選択することができ http://codahale.com/a-lesson-in-timing-attacks/

私はワンA100000000000000000000000000000000000000-の割合を取るを見つけるまで、私は、これらの値のそれぞれを通過

0000000000000000000000000000000000000000 
0100000000000000000000000000000000000000 
0200000000000000000000000000000000000000 
... snip 250 ... 
FD00000000000000000000000000000000000000 
FE00000000000000000000000000000000000000 
FF00000000000000000000000000000000000000 

他のものよりも1ミリ秒長い。私は今、そのメッセージのHMACが何であるべきかの最初のバイトがA1であることを知っています。残りの19バイトのプロセスを繰り返し、突然私はあなたとしてログインしています。

関連する問題