2016-11-10 60 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.ToBase64StringSystem.Runtime.Remoting.Metadata.W3cXsd2001.SoapBase64Binary,而不是System.Text.Encoding.UTF8.GetString

+0

感謝,但是BitConverter.ToString給我73 -58-EE-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

@Izzy想法是什麼?你現在的新問題是什麼? –

+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(); 
}