2017-12-31 24 views
-1

다음에 정의 된 MDaemon Minger 프로토콜 UDP 요청을 구성하려고합니다. specification. spec을 정확하게 해석한다고 가정하면 [email protected]의 공유 암호가 U5TttqcKSw0jJcPHrHWb 인 사서함이 요청의 문자열 버전을 어떻게 표시해야합니까?MDaemon Minger UDP 데이터 그램 요청

[email protected] d=QTNCMDgxNDEwMUIzRkJDNTM4NTUzQjg1NkU5Rjk2Mjg=

나는 그러나 상태 코드는 항상 요청에 따라 전달 된 자격 증명이 잘못되었습니다 있음을 나타내는 '2'이며, 다시 응답을 얻을. 서버가 익명 조회를 허용하도록 설정되어 있지 않으므로 자격 증명을 보내야합니다. 내가 자격 증명 매개 변수를 작성하는 방식에서 올바른 일을하지 않을 것으로 생각됩니다.

나는 공유 비밀 증명을 요청과 함께 적절하게 보내고 있지만 서버는 그것이 유효하지 않다는 것을 알리고있다. 나는 공유 비밀 증명의 패키징과 전송에 내가 뭘 잘못하고 있는지 이해하지 못한다. 프로토콜 사양 및 샘플 코드에 대한 새로운 시각을 통해 자격 증명 전송 문제를 찾는 데 도움이되기를 바랍니다.

나는 다음과 같은 코드를 통해이 도착하고 있습니다 :

public bool IsValidUser(string emailAddress) 
{ 

    var digestText = _sharedSecret + ":" + emailAddress; 
    var digest = System.Text.Encoding.ASCII.GetBytes(CreateMD5(digestText)); 
    string query = emailAddress + " d=" + System.Convert.ToBase64String(digest); 
    var sendBytes = Encoding.ASCII.GetBytes(query); 

    _udpClient.Send(sendBytes, sendBytes.Length); 

    IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); 
    var results = Encoding.ASCII.GetString(_udpClient.Receive(ref remoteIpEndPoint)); 

    return false; 
} 

public static string CreateMD5(string input) 
{ 
    // Use input string to calculate MD5 hash 
    using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) 
    { 
     byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input); 
     byte[] hashBytes = md5.ComputeHash(inputBytes); 

     // Convert the byte array to hexadecimal string 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < hashBytes.Length; i++) 
     { 
      sb.Append(hashBytes[i].ToString("X2")); 
     } 
     return sb.ToString(); 
    } 
} 

답변

0

을 자세히 사양의 검사와 내가 내가 내 오류를 실현하고있었습니다. 불필요하게 해시 값의 반환 된 바이트 배열을 가져 와서 16 진수 문자열로 변환했습니다. 나에게 MD5 해시가 들어있는 결과 바이트 배열을 Base64로 인코딩해야한다고 생각하지 않았습니다. 아래

작업 코드 : 내부 부울 IsValidUser (문자열 EMAILADDRESS) {

var digestText = _sharedSecret + ":" + emailAddress; 

    byte[] hashBytes; 
    using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) 
    { 
     hashBytes = md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(digestText)); 
    } 

    var digest = System.Convert.ToBase64String(hashBytes); 
    string query = emailAddress + " d=" + digest; 
    var sendBytes = Encoding.ASCII.GetBytes(query); 

    _udpClient.Send(sendBytes, sendBytes.Length); 

    IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); 
    var results = Encoding.ASCII.GetString(_udpClient.Receive(ref remoteIpEndPoint)); 

    //code which looks at results and return true/false here.... 
    return false; 
}