2009-06-27 2 views
6

해시 계산 성능을 향상시키기 위해 네이티브 MD5 또는 SHA1 라이브러리에 대한 C# 래퍼를 찾고 있습니다. C# 빠른 해시 계산

는 이전에 나는 ZLIB에 SharpZipLib을 전환하고보다 2 배의 성능 향상을 얻었다. (좋아, 당신은 당신이 zlib.so 또는 zlib.dll을 운영체제와 하드웨어에 따라 적절히 처리했음을 배려해야하지만, 그만한 보수를 받는다.)

은 이미 네이티브 구현에 의존 MD5 또는 SHA1 또는 둘 모두 .NET 및 모노에 대한 가치가있을 것인가?

(편집 됨) 또한 MD5CryptoServiceProvider를 고수해야 할 경우, 내가 읽는 동안 파일 해시를 계산할 수있는 방법이 있습니까? 내 말은, 청크로 바이트를 보내지 만 여전히 전체 해시를 계산한다는 것입니까?

+1

MD5는 금이 간 해싱 알고리즘이므로 더 이상 보안이 적용되지 않습니다. SHA1과의 충돌도 발견되었으며, MD5만큼 심각하지는 않지만 심각한 장애로 간주되었습니다. 보안 해싱 알고리즘이 필요한 경우 SHA2 변형 (256/512)을 선택해야합니다. – jrista

+0

@pablo, 입출력 액세스가 병목 현상이 아니라고 확신하십니까? –

+0

또한 IO가 될 수도 있습니다.하지만 zlib에 대한 경험을 통해 MD5 구현을 전환 할 때 속도가 향상 될지 여부를 생각하고있었습니다. – pablo

답변

3

SHA1CryptoServiceProvider 클래스는 기본 윈도우 API 구현을 사용합니다. 그러나 SHA1Managed은 꽤 빠릅니다.

편집 : 네, 단계별로 해시 단계를 계산하는 것이 가능하다. TransformBlockTransformFinalBlock 메서드는이 작업을 수행합니다.

+0

꽤 빠르다는 것은 많은 것을 의미 할 수 있습니다 ... 꽤 빠르다는 것은 3 배 느리다는 것을 알 수 있습니다. 여전히 300ms 당 30MB는 충분히 빠릅니다. –

0

은 그냥 BCL의 SHA1MD5CryptoServiceProvider 클래스를 사용합니다. 프레임 워크와 함께 제공되는 것들은 매우 빠릅니다.

+0

고마워요. 그게 내가 지금 사용하고있는 것입니다. 더 빨리 할 수있는 방법이 있는지 궁금합니다. 전체 파일을 해시합니다. – pablo

16

MD5와 SHA1은 네이티브 구현에 의존하지만 C++ 솔루션 + introp은 약간 더 빠를 수 있습니다. 즉, 메소드 호출 수를 줄이고 기본 구현을 최적화 할 수 있기 때문입니다.

네이티브 (SHA1CryptoServiceProvider)이 빠르게 관리 하나 (SHA1Managed)에 비해 3 배 될 수 있음을 유의하십시오. 내 계산이 잘못되지 않는 한

 
managed Time Elapsed 891 ms 
unmanaged Time Elapsed 336 ms 

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Security.Cryptography; namespace ConsoleApplication22 { class Program { static void Profile(string description, int iterations, Action func) { // clean up GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); // warm up func(); var watch = Stopwatch.StartNew(); for (int i = 0; i < iterations; i++) { func(); } watch.Stop(); Console.Write(description); Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds); } static void Main() { SHA1Managed managed = new SHA1Managed(); SHA1CryptoServiceProvider unmanaged = new SHA1CryptoServiceProvider(); Random rnd = new Random(); var buffer = new byte[100000]; rnd.NextBytes(buffer); Profile("managed", 1000,() => { managed.ComputeHash(buffer, 0, buffer.Length); }); Profile("unmanaged", 1000,() => { unmanaged.ComputeHash(buffer, 0, buffer.Length); }); Console.ReadKey(); } } } 

는 또한 관리되지 않는 구현이 약 300 밀리 초에 100MB의 데이터를 해싱되어, 마음
하십시오, 이것은 매우 드물게 병목 없을 것이다.

+0

interop 솔루션은 마샬링을 필요로하지만 그렇지 않은 경우 다른 이득을 완화 할 수 있습니다. 명심할 것. – jrista

+0

내 이해 SHA1CryptoServiceProvider 어차피 마샬링이 필요합니다, 자사의 extern 호출을 사용 –

+0

그건 의미가있다. – pablo

0

해시 적용에 따라 MD5가 적용되지 않을 수 있습니다. MD5는 오류 수정에만 유용하며, 악의적 인 파일 변경에 대한 검사로 더 이상 사용할 수 없습니다.

http://en.wikipedia.org/wiki/Md5#Vulnerability

짧은 이야기는 MD5 충돌은 파일에 16 바이트를 변경하여 발생하기 쉽다이다.