2011-03-17 63 views
6

我正在使用C#併爲字符串計算SHA1。我的問題是,這將始終產生純文本0-1和A-Z?或者它會產生具有特殊字符?我的意思是這裏的ComputeHash函數將始終返回純文本?SHA1純文本? C#.NET

SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider(); 
string receivedValue = BitConverter.ToString(sha1.ComputeHash(to_be_hash)).Replace("-", ""); 

不確定,但我認爲它應該生成特殊字符,只有當它轉換爲Base 64。

+0

'to_be_hash'是什麼類型? – knocte 2014-01-07 21:30:42

回答

8

這是一個十六進制字符串,所以只有0-9和A-F。

實際上它只是一個字節數組,但是您使用string BitConverter.ToString(byte[])方法將它變成由兩個由 - (破折號)分隔的成對的十六進制字符串。

十六進制只包含:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。16個選項,其中的一對錶示單個字節(16 * 16 = 2^8 = 256,是單個字節)。

+0

你的意思是輸出C#函數ComputeHash總是HEX字符串? – 2011-03-17 14:42:51

+0

沒有輸出實際上是一個'byte []',但你把它轉換成一個十六進制字符串,所以它總是安全的。我擴大了答案。 – Aidiakapi 2011-03-17 14:43:47

+0

這裏是原型:public byte [] ComputeHash( \t byte [] buffer ) – 2011-03-17 14:44:59

25

哈希API本身返回一個byte[]包含任意20字節的序列。

您需要將其轉換爲字符串。使用十六進制或Base64作爲編碼是流行的選擇。

BitConverter.ToString()將字符串轉換爲十六進制,字節由-分隔。既然你刪除了-,你最終得到一個40個字符的十六進制字符串(0-9,A-F),它是字母數字字符的一個子集。

因此,即使SHA-1沒有,您的代碼將始終返回字母數字字符串。

SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider(); 
byte[] hash = sha1.ComputeHash(to_be_hash) 
string delimitedHexHash = BitConverter.ToString(hash); 
string hexHash = delimitedHexHash.Replace("-", "");