2012-12-07 66 views
6

如何保存MessageDigest對象的內部狀態,以及如何保存內部狀態?我想將它保存在數據庫中,所以只能使用原始數據,如String,int,byte[]如何將MessageDigest內部狀態保存到數據庫中?

我想要實現的目標是能夠接收一個碎片文件(在很長一段時間內),將所有碎片保存在數據庫中,並在收到最後一個碎片後驗證文件的SHA512摘要而不會得到備份之前保存在數據庫中的所有數據。

所以基本上我想是這樣的:

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

回答

1

你可以序列化對象的字符串(XML格式),然後返回。

檢查: 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

相關問題