2012-12-07 10 views
6

Ist es möglich, und falls wie, den internen Status des MessageDigest-Objekts zu speichern? Ich möchte es in einer Datenbank speichern, also nur primitive Daten wie String, int, byte[] verwenden.Wie kann ich den internen Status von MessageDigest in der Datenbank speichern?

Was ich versuche zu erreichen, ist in der Lage, eine fragmentierte Datei zu erhalten (über einen langen Zeitraum), speichern Sie alle Fragmente in der Datenbank, und nach dem Empfang des letzten Fragments überprüfen Sie den SHA512 Digest der Datei ohne zu bekommen Zurück zu allen zuvor in der Datenbank gespeicherten Daten.

Also im Grunde möchte ich etwas wie folgt aus:

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

Antwort

1

Sie konnte das Objekt in String (XML-Format) serialisiert und schicken Sie es zurück.

Kontrolle: 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

Ist es tatsächlich die innere SHA Zustand retten? Das wären 512 Bits des reinen Zustands plus der aktuellen Eingangslänge zuzüglich des aktuellen unvollständigen Blocks IIRC. Also im Allgemeinen etwa 200 Bytes. –

+0

Sorry für späte Antwort;) Aber ich kann bestätigen, dass dies mit der vorgeschlagenen XStream-Technologie machbar ist. @qarma Das generierte XML ist ungefähr 12kB groß, aber es kann immer noch eine bessere Lösung sein, wenn Dateien in wenigen MB Chunks kommen. – MJar