2016-11-10 1 views
0

Я делаю это в C# создать хэш:Почему этот хэш HMAC SHA256 я создаю, используя неправильную кодировку символов?

 using (var hmacsha256 = new HMACSHA256(Encoding.ASCII.GetBytes(secret))) 
     { 
      return System.Text.Encoding.UTF8.GetString(hmacsha256.ComputeHash(Encoding.ASCII.GetBytes(message))); 
     } 

Я использую следующий JSON:

{ 
    "client_id": "26075235", 
    "client_version": "1.0.0", 
    "event": "app.uninstall", 
    "timestamp": "1478741247", 
    "data": { 
     "user_id": "62581379", 
     "site_id": "837771289247593785", 
     "domain": "" 
    } 
} 

и я получаю это:

sXm.- ! N0V @ я SIEC, 56

Я ожидаю, что хэш выглядеть следующим образом:

960aff6c335a87e6077f41066358980a88db54062505875e5a8c363ded9d027e

Если я хеширование так:

 using (var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(secret))) 
     { 
      return System.Text.Encoding.UTF8.GetString(hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(message))); 
     } 

я получаю то же самое. Как вернуть то, что я ожидаю?

Что я не понимаю об этом?

ответ

1

Произвольные двоичные данные не могут быть преобразованы в строки ... Похоже, вы хотите BitConverter.ToStringConvert.ToBase64String, или System.Runtime.Remoting.Metadata.W3cXsd2001.SoapBase64Binary, вместо System.Text.Encoding.UTF8.GetString

+0

Спасибо, однако BitConverter.ToString дает мне 73 -58-ЭЭ-6D-81-2E-15-1D-14-2D-8F-6E-F1-30-85-76-40-D3-69-14-21-53-A6-D7-49-45 -43-2C-D8-35-13-36. Есть идеи? – Izzy

+0

@ Идея для чего? какова ваша новая проблема сейчас? –

+0

Спасибо LB - мое сообщение для хэширования было неправильным, и это меня бросило. Когда я передаю правильное сообщение и удаляю '-', он работает - см. Мой ответ для довольно аккуратного способа хеширования сообщения – Izzy

1

теперь решен. Я использую этот метод расширения строки, поэтому, чтобы получить строчную HMAC SHA 256 Хэш для строки, я могу просто сделать:

mymessage.HmacSha256Digest (MySecret)

public static string HmacSha256Digest(this string message, string secret) 
{ 
    ASCIIEncoding encoding = new ASCIIEncoding(); 
    byte[] keyBytes = encoding.GetBytes(secret); 
    byte[] messageBytes = encoding.GetBytes(message); 
    System.Security.Cryptography.HMACSHA256 cryptographer = new System.Security.Cryptography.HMACSHA256(keyBytes); 

    byte[] bytes = cryptographer.ComputeHash(messageBytes); 

    return BitConverter.ToString(bytes).Replace("-", "").ToLower(); 
}