2014-07-22 3 views
1

.NET Reflector를 사용하여 사용자 이름 토큰 요소를 사용하여 메시지를 암호화하는 &에 서명해야하는 WSE3.0 서비스를 호출하는 콘솔 응용 프로그램을 디버깅하는 중입니다. 우리의 서비스 제공 업체는 WSE를 사용하므로 non .net 클라이언트를 사용해야하는 경우이를 사용하거나 서명 및 암호화의 동일한 로직을 복제해야합니다. 실제 메시지 서명이 어떻게 발생하는지 (NON .NET 클라이언트를 사용하여 복제 할 수 있도록) .NET Reflector를 사용하여 코드를 디버깅했습니다.왜이 byte [] 배열이 다르고 호출하는 메서드에 반환 될 때 총 다른 값을 보유합니까?

MessageSignature.BuildSignedInfo는 실제로 메시지에 서명하고 byte [] 배열 인 hmac를 MessageSignature.BuildSignedInfo에 반환하는 HMACSHA1SignatureFormatter.Sign을 호출합니다. 아래 는이 방법

private byte[] BuildSignedInfo(SignatureFormatter formatter) 
{ 
    this.SignedInfo.SignatureMethod = formatter.AlgorithmURI; 
    return formatter.Sign(this.CanonicalizeSignedInfo()); 
} 


public override byte[] Sign(Stream data) 
{ 
    HMACSHA1 hmacsha = new HMACSHA1(this._key); 
    return hmacsha.ComputeHash(data); 
} 

이 바이트 배열은 시계 창처럼 모습입니다이다.

MessageSignature.BuildSignedInfo (에 그 반환 바이트 [] 배열의 HMACSHA1SignatureFormatter

watch window in sign method of HMACSHA1SignatureFormatter

시계 윈도우의 표시 방법에

조사 식 창이 바이트를 얻기 위해 그 기호의 메소드를 호출 [] 배열)

watch window in Buildsignedinfo method

나는 코드를 단계별로 실행 중이며, 중간 단계의 메소드가 없다. 그 일이 일어날 이유가 있을까요?

+4

QuickWatch를 사용하면 값을 다시 계산할 수 있습니다. 재평가 버튼을 시도해보십시오. 매번 다른 값을 반환 할 것입니다. 대부분의 Hashers는 statefull입니다. –

+0

나는 이것을 시도했지만 해시 값을 변경하지 않았다. – iRamesh

+0

그럼 나도 몰라. 코드를 소유 한 경우 디버깅을 더 쉽게 (더 안정적으로) 만들기 위해 몇 개의 중간 변수를 삽입하십시오. –

답변

3

몇 가지 가능성 :

  1. 어쩌면 ComputeHash 스트림을 되감기되지 않으므로 간략한 창에서 두 번째 호출은 스트림의 다른 부분을 해시? 각 호출 전후에 스트림을 확인하십시오.

  2. 역 컴파일 된 Microsoft 코드를 실행하는 경우 해당 코드가 최적화되어 호출 순서가 변경 될 수 있습니다. 해시 함수가 실제로 호출되지 않았거나 결과가 사용자가 생각하는 곳이 아닌 경우 메서드를 단계별로 수행 할 수 있습니다.

+1

끝내 주셔서 감사합니다. 대단히 감사합니다. 당신이 언급 한 # 1 때문입니다. 결과를보기 위해 빠른보기를 사용했을 때 스트림이 마지막 위치에 있습니다. 그래서 hmac은 stream이 위치 0에있을 때 반환되는 hmac와 다릅니다. – iRamesh