2012-12-07 9 views
6

MessageDigestオブジェクトの内部状態を保存することは可能でしょうか?データベースに保存したいので、Stringintbyte[]などのプリミティブデータのみを使用する必要があります。MessageDigestの内部状態をデータベースに保存するにはどうしたらいいですか?

私が達成しようとしているのは、断片化したファイルを(長い間)受信し、すべてのフラグメントをデータベースに保存し、最後のフラグメントを受信した後にファイルのSHA512ダイジェストを確認してから以前にデータベースに保存されたすべてのデータを元に戻します。あなたは文字列(XML形式)にオブジェクトをシリアル化し、それをバック返すことができ

MessageDigest md = MessageDigest.getInstance("SHA-512"); 
// restore previous internal state of md 
md.update(dataSegment); 
// save internal md state 

答えて

1

だから基本的に私はこのような何かをしたいです。

チェック: http://x-stream.github.io/tutorial.html

public class DigestTest { 

    private static final byte[] TEST_DATA = "Some test data for digest computations".getBytes(); 

    @Test 
    public void shouldStoreAndRestoreDigest() throws Exception { 
     final MessageDigest referenceDigest = MessageDigest.getInstance("SHA-512"); 
     MessageDigest testDigest = MessageDigest.getInstance("SHA-512"); 
     referenceDigest.update(TEST_DATA); 
     testDigest.update(TEST_DATA); 
     // store state 
     final XStream xs = new XStream(new StaxDriver()); 
     xs.alias("md", MessageDigest.class); 
     final String serializedMd = xs.toXML(testDigest); 
     System.out.println(serializedMd); 
     // restore state 
     testDigest = (MessageDigest)xs.fromXML(serializedMd); 
     // --- 
     referenceDigest.update(TEST_DATA); 
     testDigest.update(TEST_DATA); 
     Assert.assertArrayEquals(referenceDigest.digest(), testDigest.digest()); 
    } 
} 
+0

それは実際に内部SHAの状態を保存していますか?これは、512ビットの純粋な状態プラス現在の入力長+現在の不完全ブロックIIRCになります。したがって、一般的には約200バイトです。 –

+0

遅れて申し訳ありません;)しかし、これは提案されたXStream技術を使用して実行可能であることを確認できます。 @ qarma生成されたxmlのサイズはおよそ12kBですが、数MBのチャンクでファイルを扱う場合には、より良い解決策となります。 – MJar

関連する問題