8

是否有可能,如果不是,如何保存 MessageDigest 对象的内部状态?我想将它保存在数据库中,所以只能使用原始数据,如String, int, byte[].

我想要实现的是能够接收碎片文件(在很长一段时间内),将所有碎片保存在数据库中,并在接收到最后一个碎片后验证文件的 SHA512 摘要而不取回所有数据以前保存在数据库中。

所以基本上我想要这样的东西:

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

1 回答 1

0

您可以将对象序列化为字符串(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());
    }
}
于 2012-12-28T00:42:52.040 回答