我正在使用C#并为字符串计算SHA1。我的问题是,这总是产生纯文本0-1和A-Z吗?或者它也会产生具有特殊字符的东西?我的意思是这里的ComputeHash函数会返回纯文本吗?
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
string receivedValue = BitConverter.ToString(sha1.ComputeHash(to_be_hash)).Replace("-", "");
不确定,但我认为只有在转换为Base 64时才应生成特殊字符。
答案 0 :(得分:25)
散列API本身返回一个包含任意20字节序列的byte[]
。
您需要自己将其转换为字符串。使用Hex或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("-", "");
答案 1 :(得分: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,是一个字节)。