2017-05-05 102 views
2

我想知道是否有標準代碼使用密鑰生成SHA256哈希。我遇到了幾種類型的代碼,但是它們不會生成相同的輸出。什麼是使用C#生成HMAC SHA256的密鑰的標準代碼是什麼?

代碼發現在JokeCamp

private string CreateToken(string message, string secret) 
{ 
    secret = secret ?? ""; 
    var encoding = new System.Text.ASCIIEncoding(); 
    byte[] keyByte = encoding.GetBytes(secret); 
    byte[] messageBytes = encoding.GetBytes(message); 
    using (var hmacsha256 = new HMACSHA256(keyByte)) 
    { 
    byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); 
    return Convert.ToBase64String(hashmessage); 
    } 
} 

這裏是另外一個,我發現

private static string ComputeHash(string apiKey, string message) 
{ 
    var key = Encoding.UTF8.GetBytes(apiKey); 
    string hashString; 
    using (var hmac = new HMACSHA256(key)) 
    { 
     var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); 
     hashString = Convert.ToBase64String(hash); 
    } 

    return hashString; 
} 

由這兩個生成的代碼是會產生什麼不同的http://www.freeformatter.com/hmac-generator.html#ad-output

我會將SHA256用於我們的外部API之一,其中消費者將散列數據並將其發送給我們。所以我們只是想確保我們使用標準方法,以便他們發送正確的散列。另外,我想知道是否有這方面的知名人士。我也試圖找到Bouncy Castle的解決方案,但是,我找不到使用密鑰哈希的方案。

回答

2

區別在於字符編碼(在您的示例中爲ASCII與UTF-8)。請注意,散列算法需要一個字節數組,並且您事先將字符串轉換爲該字節數組。

你的問題「什麼標準代碼」可能處理不當的答案,身份證說,如果預計輸入含有只是 ASCII字符空間的內容,去,如果不去爲UTF-8。無論哪種方式 - 將它傳達給你的用戶

如果你想從可用性的角度來看待它,並使其成爲用戶的最佳選擇 - 兩者兼而有之。這兩種方式散列內容並再次檢查用戶入站散列,但這一切都取決於您對時鐘週期與安全vs可用性的評估(可以有兩個)

0

它們幾乎是等效的。

區別在於字符串的編碼是如何建立的。

在代碼的第一部分中,它採用ASCII,而在第二部分中它假定爲UTF-8。字符串可能會使用另一種編碼,而不是這些編碼。

但無論如何,這個想法是要明白這個操作的目標是什麼。在此背景下,真正相關的事情是:

  1. 給予平等的輸入,輸出應該是相同的
  2. 應該沒有辦法只有通過了解輸出(在合理的時間量內)來檢索明文
  3. 散列之後,您不再需要純文本的原始輸入。

安全的加密散列函數(意味着不像MD5這樣的舊函數)可以實現這一點。

然後,如果存儲散列的數據存儲受到危害,攻擊者將只擁有一個無法用於檢索原始明文的散列。這就是爲什麼使用散列而不是加密的原因,加密是一種可逆操作(通過解密)。

然後,在系統內部,如果您決定使用一種編碼,則需要在系統中的所有組件之間保持一致,以便它們可以互操作。