2012-12-07 4 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

관련 문제