2009-10-26 1 views
2

.NET Framework에서 발견 된 XMLSerializer를 사용하여 직렬화하는 개체에 대한 HMAC를 생성해야합니다. 각 개체에는 개체 값 자체의 해시를 포함하지만 "HMAC"필드는 제외하고 "HMAC"라는 속성이 포함됩니다. CLR에 내장 된 솔루션에 대해 언급 한 this question을 찾았지만 호출 된 내용이나 사용 방법에 대해 자세히 설명하지 않았습니다..NET에서 XMLSerialized 개체에 대한 해시 서명 (HMAC)을 생성하는 가장 좋은 방법은 무엇입니까?

샘플 객체는 다음과 같이 보일 것입니다 :

[Serializable] 
[XmlRoot("request", IsNullable = false)] 
public class Request 
{ 

    [XmlElement(ElementName = "hmac")] 
    public string Hmac { get; set; } 

    [XmlElement(ElementName = "nonce")] 
    public string Nonce { get; set; } 

    [XmlElement(ElementName = "expiration")] 
    public DateTime Expiration { get; set; } 

    /* A bunch of other properties to be serialized */ 

    private Request() { } 

    public Request(string hmac, string nonce, DateTime expiration) 
    { 
     Hmac = hmac; 
     Nonce = nonce; 
     Expiration = expiration; 
    } 
} 

HMAC 속성은 HMAC 개체 자체를 제외한 전체 개체의 직렬화로 설정해야합니다. 내 첫번째 생각은 포함 두 단계 직렬화, 어떤 종류의 설정됩니다

  1. 이 결과를 해싱 전체 오브젝트
  2. 일렬 첫 번째 패스
  3. 에 HMAC 개체에 xmlignore 속성을 설정을하고, HMAC 속성의 값을 설정합니다.
  4. 모든 것을 다시 직렬화하여 전송할 준비가되었습니다.

이 방법이 가장 좋은 방법일까요? 누군가는 전에 이것 같이 무엇이든을하고, 당신은 그것에 관하여가는의 청결한 방법 인 것을 찾아 냈는가 ???

답변

2

정확한 효과를 얻으려면 두 번 직렬화해야한다고 생각합니다.

[XmlIgnore] 
public bool HmacSpecified 
{ 
    get { return !String.IsNullOrEmpty(this.Hmac); } 
    set { } 
} 

이 무엇을 할 것인지 (XML 직렬화 취급 특별히 프로그래밍 비슷한 이름의 속성을 방출할지 여부를 제어 할 수 .NET) 공공 지정된 속성을 추가하는 대신 쉽게이 XmlIgnore를 사용하지하는 것입니다 있는지 확인하지만 한 가지 방법 hmac XML 노드가있는 경우에만이를 내 보냅니다. DefaultValueAttribute을 사용하면 비슷한 효과를 얻을 수 있지만 일부 불일치가 있습니다 (예 : null은 편집하는 동안 ""으로 바뀝니다). 또한 논리가 단일 컨 티니 언트 센티널 값보다 더 복잡한 경우 속성에서 처리 할 수 ​​있지만 정적 특성에서는 처리 할 수 ​​없습니다.

get { return !this.IsCalculatingHmac(); } 

형식이 설명 된 내용과 정확히 일치해야한다면 이렇게 할 수 있습니다.


당신은 출력 형식의 유연성, 메시지 본문이 포함 된 메시지 용기 (현재의 XML 문서)와 HMAC 서명 값을 갖는된다 고려해 볼 수 있습니다 다른 방법이있는 경우. 이 방법을 사용하면 문서를 한 번만 serialize하면됩니다.

봉투가 더 큰 일련 화 문서의 일부인 경우에도 봉투에 IXmlSerializable.WriteXml 인터페이스를 구현할 수 있습니다. 이렇게하면 메시지를 신중하게 문자열로 직렬화 한 다음 해시를 수행 한 다음 XmlWriter.WriteRaw을 통해 HMAC와 메시지 요소를 모두 하나로 작성할 수 있습니다.

성능이 중요한 경우 이렇게 할 수 있습니다.

+0

"봉투"방식이 더 좋습니다. 봉투 아이디어는 물론 SOAP의 근본입니다. – Cheeso

관련 문제