2009-05-27 3 views
3

.NET 3.5 프로젝트에서 작업 중이며 32 비트 해시 값이 필요합니다. 32 비트 해시 (MD5는 128 비트, SHA1은 160 비트 등)를 반환하는 .NET 암호화 클래스의 메소드가없는 것 같습니다. CRC32 클래스를 구현했지만 이미 존재하는 SHA1 및 MD5 해싱 함수가 훨씬 빠르다.160 비트 SHA1 해시의 처음 32 비트가 CRC32 해시의 대체 가능한 대체품입니까?

SHA1 해시 기능을 사용하고 처음 32 비트를 해시 값으로 저장하기 위해 문제가 발생합니까? 즉, 충돌 가능성이 증가 했습니까?

+2

전체 20 자 SHA-1 해시를 저장할 수 없다는 것을 어떻게하고 있습니까? 또한 CRC32는 해시가 아니므로 전송 오류 감지 메커니즘이므로 오류 검색이 필요한 경우 해시는 실제로 그렇게 할 방법이 아닙니다. – jmucchiello

+0

4 바이트 해시는 공간을 절약하기 위해 선택되었습니다. 해시는 모니터링 장치에서 오는 체크섬 데이터 블록에 사용되며 그 중 수백만 개가있을 수 있습니다. 아마 모든 것을 저장하는 것이 문제가되지 않을 것입니다. 당신은 재미있는 말을했습니다. "전송 오류 탐지 메커니즘"과 해시의 차이점은 무엇입니까? 암호 강도 (이 특정 응용 프로그램은 필요하지 않습니다)? – raven

+0

뻔뻔한 셀프 플러그인 : cmdhashgen은 CRC32를 지원하며 HashAlgorithm에서 파생되므로 다른 사람들과 같은 방법으로 사용할 수 있습니다. Crc32.cs를 확인하십시오. http://cmdtools.codeplex.com/ –

답변

6

CRC32 (선형 코드)의 추가 기능을 원한다면 출력을 32로 자르는 것이 좋습니다. 비트.

일부 암호화 해시 함수의 출력을 잘라내는 것이 내결함성에 대한 보안을 손상시킬 수 있는지 여부는 공개 된 연구 문제입니다 (올바르게 기억하는 경우 "부 자연스러운"생성 된 예제가 있음). 그러나 NSA (아마도 NSA의 승인을 얻은) NIST는 SHA-224를 SHA-256으로부터 어쨌든 얻기 위해 절단 기술을 사용했다 (article about SHA in wikipedia 참조).

EDIT : CRC32는 단일 비트 오류를 ​​감지 할 수 있지만 암호화 해시 함수는 동일한 해시 값을 가진 두 입력을 찾을 수없는 속성을 가져야합니다.

"생일 패러독스"(위키피디아 참고)를 알고 있습니까? 32 비트 체크섬을 사용하면 약 2^16 개의 입력이있을 때 충돌 (예 : 동일한 해시 값을 갖는 두 개의 입력)이 발생할 것으로 예상되며 더 많은 입력을 해시 할 수 있습니다. (당신의 코멘트를 다시 읽는 것은 당신에게 문제가되지 않을 수도 있습니다.)

+0

NIST에 충분하다면 충분합니다. – raven

0

암호화 목적으로 32 비트를 사용하지 않으려면 확인해야합니다. 그렇지 않으면 전체 해시와 동일한 분포를 갖는 처음 32 비트에 의존하지 않을 것입니다.

더 넓은 해시를 사용할 수없는 이유는 무엇입니까?

0

CRC32는 아마도 필요에 따라 적당 할 것입니다. 이것은 this question에서 논의되었습니다.

해시 프리미티브를 잘라내는 데있어 많이 사용되는 응용 프로그램은 키를 생성하는 데 사용되는 SSL/TLS Pseudo Random Function (PRF)입니다. HMAC, 씨앗 및 레이블을 사용하여 여러 번 해싱 한 다음 필요로하는 바이트 수만큼 잘라내서 필요한만큼의 바이트를 생성합니다.

하지만 특정 질문에 관해서는

, 당신은 INT32의에 해시의 출력을 읽고 당신이 편집증 환자 인 경우 다음 그들을 함께에 xor 수 :

static void Main() 
{ 
    int xorCrc = GetHashedCrc(new SHA1Cng(), new byte[] {0xDE, 0xAD, 0xBE, 0xEF}); 
} 

private static int GetHashedCrc(HashAlgorithm algorithm, byte[] bytesToHash) 
{ 
    byte[] hash = algorithm.ComputeHash(bytesToHash); 
    int totalInt32s = hash.Length/sizeof(int); 
    int result = 0; 
    for(int i = 0; i < totalInt32s; i++) 
    { 
     int currentInt = BitConverter.ToInt32(hash, sizeof(int)*i); 
     result = result^currentInt; 
    } 

    return result; 
} 
+1

나쁜 생각. 이것은 단지 복잡성을 추가하고 전혀 이득이 없습니다. SHA1, HMAC 등을 사용하면 결과가 이미 "임의"입니다. 결과를 잘라내는 것만으로도 충분합니다. 예를 들어 NIST가 더 짧은 해시 (예 : SHA-224 또는 SHA-384)를 제안하거나 더 짧은 HMACS를 제안하는 방법입니다. – Accipitridae

+0

동의. 나는 모든 것을 사용하는 방법을 찾고 있었지만, 보안상의 차이점이없고 추가 지시가 필요하다는 것은 맞습니다. –

2

해시 함수는 입력을 동등하게 분배한다는 가정을 감안할 때 그것의 codomain에, 또한 그것의 어떤 부분 집합든지에 동등하게 배부 할 것이라는 점을 추측하는 것은 논리적 인 것처럼 보인다. 그러나 "원시"32 비트 해시 함수를 사용하는 것이 더 나은 선택 일 수 있습니다. 어쩌면이 문제에 더 많은 사람이 내 직감보다 더 나은 이유를 우리에게 제공 할 수 있습니다 :)

1

왜 그냥 string.GetHashCode()를 사용하지 않습니까? 이 알고리즘은 32 비트 해시 값을 계산하고 실제 데이터에서 충돌을 거의 발생시키지 않도록 설계되었습니다. 물론, 안전하지는 않지만 질문에는 요구 사항이 포함되어 있지 않습니다.

+0

String.GetHashCode는 32 비트 및 64 비트 모드에서 다른 결과를 생성하는 단점이 있습니다. 또한 Microsoft가 새로운 .NET 버전을 출시 할 때도 바뀝니다. 이것은 해시를 지속하거나 네트워크를 통해 전송할 때 문제가됩니다. – Constantin

관련 문제