在Vista和XP中SHA1哈希值不同

时间:2009-10-19 01:09:53

标签: c# .net-2.0 hash sha1

在使用C#.NET 2.0(在Vista上)的WinForm应用程序中,我使用SHA1哈希从字符串创建哈希并将哈希存储在文本文件中(使用UTF-8编码)。我想在一个条件中使用存储在文本文件中的哈希。当我在Vista中运行项目时它工作正常(即条件结果为true),但是当我在XP中运行时,项目不会运行。

在Vista中创建哈希的方式与XP不同吗?

代码提取

byte[] HashValue;
byte[] MessageBytes = Encoding.UTF8.GetBytes(strPlain);
SHA1Managed SHhash = new SHA1Managed();
StringBuilder strHex = new StringBuilder("");
HashValue = SHhash.ComputeHash(MessageBytes);
foreach (byte b in HashValue)
{
    strHex.AppendFormat("{0:x2}", b);
}
// storing strHex in a text file with UTF-8 encoding

测试条件

string newHash = Program.GetHash("This will be hashed.");
// GetHash() does has the same code as above, but instead of storing hash in file in return
// hash.
bool validHash = newHash.Equals(oldHash);
// old has is the one stored in file
if (validHash)
{
    // some code
}

[编辑]

  

主要问题是相同的代码   在Vista中运行良好,但会崩溃   在XP中。如果有一些逻辑   问题它不适用于任何操作系统。

感谢。

3 个答案:

答案 0 :(得分:1)

你是如何在机器之间传递二进制文件的?当我在我的机器上准备一个ClickOnce软件包时,我曾经用7zip提供的最大压缩模式压缩二进制文件并在另一端用winzip解压缩时遇到了哈希验证问题。

答案 1 :(得分:0)

我很好奇为什么你提到UTF-8编码与将哈希值存储在文本文件中有关。您是尝试存储原始数据字节,以某种方式转换为UTF-8,还是存储哈希值的十六进制表示?

通常,当在文本文件中存储哈希值时,您将使用十六进制表示,例如:

3e2f9d9069abd6ace2cb18f7390a06c034a0f9dd

没有必要专门使用UTF-8编码,因为上面是普通的普通ASCII。

答案 2 :(得分:0)

我怀疑存储在文件中的旧哈希可能不正确。在每台计算机上试用一个简单的控制台应用程序代码段。类似的东西:

Console.WriteLine(Program.GetHash("This will be hashed."));

如果这些确实给出了相同的结果,那么它必须与比较例程有关(即上面提到的oldHash)。

还有一点需要注意;我看到你正在使用bool validHash存储比较结果,但之后检查boolean validSource。这只是一个错误吗?