2009-07-27 3 views
1

나는 가장자리가있다. 필자는 상업적으로 폐쇄 된 소스 도구에서 생성 된 바이너리 데이터 파일을 읽는 코드를 작성하고 있습니다. 데이터 형식에 대한 정보는 문서에 지정되어 있습니다.은 길이가 0 인 메시지에 대해 HMACSHA1을 정의합니까?

데이터 무결성 검사의 경우 공급 업체의 사양은 RFC2898에 따라 암호에서 파생 된 키를 사용하여 SHA1을 기반으로 HMAC을 요구합니다. 많은 프로그래밍 환경에는 이러한 해시를 생성하는 HMACSHA1 클래스가 있습니다.

길이가 0이 아닌 데이터 스트림의 경우 해시를 성공적으로 계산할 수 있으며 코드의 계산은 공급 업체의 구현과 일치합니다. 즉, 내 코드는 공급 업체가 작성한 파일을 읽고 인증 할 수 있으며 그 반대의 경우도 마찬가지입니다.

그러나 데이터 스트림의 길이가 0이면 공급 업체의 도구가 모두 0이 아닌 해시를 내 보냅니다. HMACSHA1을 실행할 메시지가없는 경우 어디서 왔는지는 알 수 없습니다.

HMACSHA1 또는 모든 HMAC의 경우 "null 메시지"의 경우에 대해 정의 된 MAC은 무엇입니까?

제 질문은 플랫폼에 구애받지 않는다고 생각합니다.하지만 .NET을 사용하고 있습니다. System.Security.Cryptography.HMACSHA1입니다.


하나의 플랫폼 고유의 비트가 : 나는 인스턴스를 통해 데이터를 실행하지 않은 경우, 해당 유형의 인스턴스에 대한 해시 속성을 얻을 때, 나는

Exception: System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Security.Cryptography.HashAlgorithm.get_Hash() 

를 얻을 수 해시 할 것이 없기 때문에 이것은 전혀 놀라운 일이 아닙니다.

어떤 힌트가 있습니까?

답변

3

어둠 속에서 허우적 거리며 나는 필요한 것을 발견했습니다. HMACSHA1이 길이가 0 인 메시지의 경우에 대해 정의되어 있는지 확실하지 않은 경우

HMACSHA1.ComputeHash()를 호출하고 길이가 0 인 바이트 배열을 전달하면 .NET에서 해당 주소를 찾을 수 있습니다. 예상되는 원하는 해시.

죄송합니다. 이전에 예약 된 프로그래밍으로 되돌아갑니다.

+0

이것은 HMACSHA1이 길이가 0 인 메시지에 대해 정의되지만 정의되지 않은 (널) 메시지에는 정의되지 않음을 의미합니다.예상대로. –

1

길이가 0 인 배열을 해시에 추가해야합니까? 기본 객체는 첫 번째 호출 중에 생성 될 가능성이 큽니다. 제로 길이 파일 해시 몇몇 구현을 사용

준다 : 0 < = N < 2^20 곳

MD5 : d41d8cd98f00b204e9800998ecf8427e 
SHA-1 : da39a3ee5e6b4b0d3255bfef95601890afd80709 
+0

HMACSHA1에는 지정하지 않은 키가 필요합니다. 또한 내가 따르고있는 구현은 소금을 사용합니다. 실제로 제공하는 해시는 실제로 유용하지 않습니다. – Cheeso

+0

죄송합니다. 잠 들어서 제대로 질문을 읽지 않았습니다. 이들은 HMAC가 아닌 직접 MD5/SHA1 해시 값입니다. – devstuff

4

HMACSHA1이 n 비트의 모든 입력에 대해 정의 - 160

HMACSHA1가 정의 SHA1 (K* || SHA1 (K** || 텍스트))으로, K*K**은 키에서 파생 한 길이가 20 바이트 인 값입니다 (FIPS 198a 참조).

그래서 HMACSHA1 ("빈 문자열") = SHA1 (K* || SHA1 (K**))은 매우 잘 정의되어 있습니다.

+0

감사합니다. 매우 유용합니다. – Cheeso

관련 문제