2016-07-20 10 views
3

이전에 SHA1 + MD5를 결합하는 것에 대해 question에게 물었습니다.하지만 그 후에 SHA1을 계산하는 것을 이해 한 다음 lagrge 파일의 MD5가 SHA256보다 빠릅니다. 필자의 경우 4.6GB 파일은 Linux 시스템에서 (C# MONO)를 기본 구현 SHA256으로 약 10 분이 소요됩니다. 파일 가져 오기 SHA256 해시 코드 및 체크섬

public static string GetChecksum(string file) 
{ 
    using (FileStream stream = File.OpenRead(file)) 
    { 
     var sha = new SHA256Managed(); 
     byte[] checksum = sha.ComputeHash(stream); 
     return BitConverter.ToString(checksum).Replace("-", String.Empty); 
    } 
} 

은 그 때 나는 this topic 어떻게 든 그들이에 말에 따라 코드를 변경 읽어

public static string GetChecksumBuffered(Stream stream) 
{ 
    using (var bufferedStream = new BufferedStream(stream, 1024 * 32)) 
    { 
     var sha = new SHA256Managed(); 
     byte[] checksum = sha.ComputeHash(bufferedStream); 
     return BitConverter.ToString(checksum).Replace("-", String.Empty); 
    } 
} 

을하지만 그것은 그러한 애정이없는 약 9 분 소요됩니다.

그런 다음 동일한 파일에 대해 리눅스에서 sha256sum 명령을 사용하여 파일을 테스트하려고합니다. 위의 코드와 Linux 명령이 모두 같은 결과를 나타냅니다.

누군가 해시 코드와 체크섬의 차이점에 대해 읽으라고 조언했으며, 차이점을 설명하는 this topic에 도달했습니다.

내 질문은 다음과 같습니다

위의 코드와 시간에 리눅스 sha256sum 사이의 서로 다른 원인이 무엇
  1. ?

  2. 위의 코드는 무엇을 수행합니까? (해시 코드 계산 또는 체크섬 계산을 의미합니까? C#에서 파일의 해시 코드와 파일의 체크섬을 검색하면 두 코드 모두 위의 코드에 도달합니다.)

  3. SHA256이 충돌에 저항력이 있더라도 sha256sum에 대한 동기 부여 된 공격은 무엇입니까?

  4. C#에서 sha256sum만큼 빨리 구현할 수 있습니까?

+0

'프로세스'를 사용하여 코드에서 'sha256sum'을 호출 할 수없는 이유가 있습니까? –

+0

@NateDiamond 예! 먼저이 프로그램은 리눅스뿐만 아니라 Windows에서 실행되어야합니다. 두 번째는 내 질문에 언급했듯이 체크섬의 안전성이 충분한 지 여부 (또는 해시 코드) –

+0

디스크에서 파일을 읽는 비용으로 완전히 조정해야합니다. 9 분은 상상도 할 수 없지만 엉뚱한 스핀들 드라이브와 충분한 RAM이없는 값싼 노트북이 필요합니다. 사용하는 것을 문서화하십시오. –

답변

4
  1. 추측은 File.Read 작업의 모노 구현에서 추가적인 버퍼링이 있다는 것입니다. 최근에 큰 파일의 체크섬을 조사한 결과 괜찮은 사양의 Windows 컴퓨터에서 모든 것이 원활하게 실행되는 경우 대략 Gb 당 6 초를 예상해야합니다. 이상하게도 하나 이상의 벤치 마크 테스트에서 SHA-512가 SHA-256보다 눈에 띄게 빠르다고보고되었습니다 (아래 3 참조). 한 가지 다른 가능성은 데이터를 할당하는 것이 문제가 아니라 일단 읽은 바이트를 폐기하는 것입니다. 하나의 큰 꿀꺽 꿀꺽 거리에서 스트림을 읽는 대신 단일 배열에서 TransformBlock (및 TransformFinalBlock)을 사용할 수 있습니다.이 알고리즘이 작동하는지는 잘 모르지만 조사가 있습니다.

  2. 해시 코드와 체크섬의 차이점은 (거의) 의미입니다. 그들은 둘 다 입력의 데이터에 상당히 독특한 더 짧은 '마법'수를 계산합니다. 그러나 4.6GB의 입력과 '상당히'의 출력이 다소 제한적이라면. 체크섬은 안전하지 않으며, 약간의 작업만으로도 충분한 출력물로부터 입력을 파악할 수 있으며, 출력에서 ​​입력까지 모든 종류의 안전하지 않은 작업을 거슬러 올라갈 수 있습니다. 암호 해시는 계산하는 데 시간이 더 오래 걸리지 만 입력의 한 비트 만 변경하면 출력이 급격하게 변경되고 좋은 해시 (예 : SHA-512)의 경우 출력에서 ​​입력으로 돌아 오는 알려진 방법이 없습니다.

  3. MD5는 깨지기 쉽기 때문에 필요한 경우 PC에서 출력을 생성 할 수 있습니다.SHA256은 여전히 ​​안전 할 것이지만 몇 년 안에는 나오지 않을 것입니다. 프로젝트의 수명이 수십 년 내에 측정 된 후에 변경해야한다고 가정하십시오. SHA512는 알려진 공격이 없으며, 아마도 SHA256보다 빠르기 때문에 어쨌든 추천 할 것입니다. Benchmarks는 MD5보다 SHA512를 계산하는 데 약 3 배의 시간이 걸리므로 속도 문제를 해결할 수있는 방법이라고 설명합니다.

  4. 위에서 언급 한 것 외에 다른 아이디어는 없습니다. https://crypto.stackexchange.com/questions/26336/sha512-faster-than-sha256

    응답에서 편집 코멘트에 의문을 제기하는 등 독서의 비트에 대한

파일이 시간 사이에 변경 한 경우 검사의 목적은 사용자가 점검 할 수 있도록하는 것입니다 당신은 원래 그것을 쓰고, 그것을 사용할 시간이되었습니다. SHA512의 경우 작은 비트 512 비트를 생성하여 원본 파일의 모든 비트가 출력 값에 적어도 일부 기여합니다. 해시 코드의 목적은 동일하며 파일을 신중하게 관리하여 다른 사람이 동일한 출력 값을 얻는 것이 정말 어렵습니다. 전제는 검사 합계가 처음에 동일하고 검사 할 때 파일이 동일하고 파일이 다르면 파일이 확실히 변경된다는 것입니다. 위에서 한 일은 작은 값을 생성하기 위해 읽는 비트를 굴림, 접기 및 스핀들로하는 명제를 통해 파일 전체를 공급하는 것입니다.

예를 들어, 현재 응용 프로그램에서 어떤 크기의 파일 부분이 변경되었는지를 알아야하므로 파일을 16K 블록으로 분할하고 각 블록의 SHA-512 해시를 가져와 다른 드라이브의 별도 데이터베이스에 저장하십시오. 파일이 변경되었는지 확인하기 위해 각 블록의 해시를 재현하여 원본과 비교합니다. SHA-512를 사용하고 있기 때문에 파일이 변경 될 가능성은 있지만 상상할 수 없을만큼 작습니다. 따라서 데이터베이스에 100MB의 해시를 저장하고 100MB의 데이터를 변경하지 않아도됩니다. 나는 해시를 취하는 것과 동시에 파일을 복사하고 있으며, 프로세스는 완전히 디스크 바운드입니다. USB 드라이브에 파일을 전송하는 데 약 5 분이 걸리며이 중 10 초는 해시와 관련이 있습니다.

해시를 저장하는 디스크 공간이 부족합니다. 게시물에서 해결할 수없는 문제가 있습니다 ... USB 스틱을 구입 하시겠습니까?

+0

음, sha256이 sha512보다 느리다는 게 놀랍습니다! 다른 질문이 있습니다. 위에서 언급 한 코드는 무엇입니까? 조롱일지도 모르지만 나는 '파일 체크섬 가져 오기'와 '파일 해시 가져 오기'를 검색 할 때 다른 것을 찾을 수 없습니다. 둘 다 같은 결과를줍니다. 사람들이 정확히 무엇을하고 있는지를 모르는 것 같습니다. :). (나처럼!) –

+0

또 다른 것은 sha512에 128 바이트를 저장할 수 없다는 것입니다! 거기에 파일의 톤과 나는 충분한 볼륨이 없습니다. –

+0

답변을 편집합니다. –