2015-08-19 67 views
-4

我怎樣才能獲得SHA1 hash在C#中相當於通過現場製作http://www.sha1-online.com/在C#中使用SHA1哈希計算字符串

我的樣本串

「20150819100015.test.1002-4-2015.978.GBP」

其散列字符串

「caed6ade209e95ad973 cce8def473f1e39e75c0b」

+1

請勿使用SHA-1。它被打破了,走開了。 –

+0

@Fred肯定,但有時您需要與傳統或維護不當的系統進行交互。 – CodeCaster

+0

@CodeCaster,true。只是警告,以防萬一。 –

回答

1

注:更新我的回答更具體手頭反射後到的意見的問題。

哈希值是字節數組上的計算機,由於字符串的字節數組表示形式取決於您使用的文本編碼,因此可能無法回答您的問題。這是因爲我們不確切知道http://www.sha1-online.com使用哪種文本編碼。

我在下面做了一個假設,那就是使用UTF8編碼,所以雖然我的示例代碼將在相應的輸入中產生您在問題中指定的散列,但它可能並不總是產生與其他散列相同的散列http://www.sha1-online.com給定輸入。

.NET Framework提供了SHA1的3個類實現,即SHA1Cng,SHA1CryptoServiceProvider和SHA1Managed。

這些實現之間的主要區別在這裏討論Which one to use: Managed vs. NonManaged hashing algorithms,但我已經習慣了SHA1Managed在下面的代碼片段中,因爲它完全在託管代碼中實現,所以儘管速度較慢,但​​應該可能更容易移植到不同的平臺。

散列的輸出也是一個字節數組,因此把散列成文本表示我已轉換的字節,以它們的十六進制表示,然後連接起來它們作爲這似乎是http://www.sha1-online.com選擇使用的表述。

static void Main(string[] args) 
{ 
    var sha1 = new System.Security.Cryptography.SHA1Managed(); 
    var plaintextBytes = Encoding.UTF8.GetBytes("20150819100015.test.1002-4-2015.978.GBP"); 
    var hashBytes = sha1.ComputeHash(plaintextBytes); 

    var sb = new StringBuilder(); 
    foreach (var hashByte in hashBytes) 
    { 
     sb.AppendFormat("{0:x2}", hashByte); 
    } 

    var hashString = sb.ToString(); 
} 
+1

這個答案有什麼不對?如果沒有留下評論爲什麼它沒有用,請不要投票。 – DanL

+1

「這裏,我寫了你的代碼」沒有任何解釋就沒有被認爲是一個很好的答案。 – CodeCaster

+0

Ops的問題是「我怎樣才能在C#中獲得相當於由網站生成的SHA1哈希」。正如你建議的「在這裏,我寫了你的代碼」不是一個好方法,但它並不會使這種方法失效。我相信我的方法是有保證的,因爲它是一個相對簡單的任務,而操作系統是語言特定的,所以這樣一個簡單的代碼片段就能滿足所需的目的。 如果Op自己嘗試了一些東西,但沒有得到相同的答案(例如,因爲他使用了錯誤的編碼),那麼我的答案就有理由作出解釋。但簡明性很有用。 – DanL