1

代码1:(将SHA1结果转换为字符串的简单方法)

byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
SHA1CryptoServicesProvider x = new SHA1CryptoServicesProvider();
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
   s.Append(b.ToString("x2").ToLower());
result1 = s.ToString();

Code2:(从世界之初就存在于项目中的遗留代码)

byte[] bs = System.Text.ASCIIEncoding.GetBytes(input);
SHA1CryptoServicesProvider x = new SHA1CryptoServicesProvider();
bs = x.ComputeHash(bs);
char[] c = new char[bs.length]
for(int i=0; i<bs.length; i++)
  c[i] = (char)(bs[i] & 0x7f);
resutl2 = new StringBuilder().Append(c).ToString();

有什么map()函数可以用来评估result1result2

result1 == map(result2)

“代码 2”是什么意思0x7f

4

3 回答 3

2

您的第二个代码在四个方面不好:

  • 它假定输入字符串完全由 ASCII 字符组成。(您的第一个代码处理所有 Unicode)
  • 它会丢失结果中每个字节的最高位,通过使用b & 0x7f- 这只是与二进制值 01111111 的按位“与”,因此结果在 0-127 范围内而不是 0-255 范围内
  • 在许多情况下,它以不可打印的文本结尾,这很可能最终在某些转换中被破坏
  • (远不那么重要)它无缘无故地使用 StringBuilder ;最后一行可能是

    result2 = new string(c);
    

给定一个result1值,您可以计算出原始文本是否会映射到给定result2值(假设原始文本首先是 ASCII),但是您不能反过来工作,因为数据已经丢失。(有几个result2值可以产生相同的result1值。)这甚至假设您可以获得确切的result2值 - 由于它最终使用控制字符的方式,您很可能会发现更多的数据正在丢失。

于 2013-04-10T05:50:23.287 回答
2

0x7f 中的“代码 2”是什么意思?

& 0x7f手段,即“& 128只保留第一个(最低有效)7 位”,它强制输出保持纯 ASCII(ASCII 仅使用 7 位) - 通过简单地丢弃任何不适合的信息。

有什么map()函数可以用来评估result1result2

然而,最大的问题是在开始时使用不同的编码:除非input只包含 ASCII 文本(即仅使用前 7 位的字符),否则您将散列完全不同的字节数组 ( bs),因此最终输出将无论如何都不能等同。由于散列不是一般可逆的,因此您将无法对此进行补偿。

于 2013-04-10T05:49:04.213 回答
0

在代码 1 中,我们看到:

s.Append(b.ToString("x2").ToLower());

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx我们看到字节的 toString("x2") 意味着每个字节将被呈现为两个十六进制数字,然后小写 - 所以 0a, f9 , ETC。

但在代码 2 中,我们看到:

c[i] = (char)(bs[i] & 0x7f);

做 (bs[i] & 0x7f); 意味着我们在将其放入返回值之前删除第 8 位(将其设置为 0)。这意味着我们在原始哈希中丢失了信息——大约八分之一的信息被清除了。这意味着我们无法确定 result1 将在 result2 上使用任何函数 - 但您可以采用另一种方式,在 result1 上执行一个函数,通过将其转换回字节数组来为您提供结果 2。

如果代码 2 的目的是将散列呈现为可打印的字符串,base64 编码是一个更好的主意(google it)(当然,可打印的十六进制编码也可以)

此外,代码 1 和代码 2 在开始时都使用不同的编码。如果传递给代码 1/2 的字符串中包含 unicode,而不仅仅是纯 ASCII,那么您将立即对不同的事物进行哈希处理,这立即是不可调和的。

于 2013-04-10T05:53:17.280 回答