2011-03-17 65 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("-", "");