1

在使用 C#.NET 2.0(在 Vista 上)的 WinForm 应用程序中,我使用 SHA1 哈希从字符串创建哈希并将哈希存储在文本文件中(使用 UTF-8 编码)。我想在一个条件下使用存储在文本文件中的哈希值。当我在 Vista 中运行该项目时,它可以正常工作(即条件结果为真),但是当我在 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 中出现故障。如果有一些逻辑问题,它不应该在任何操作系统中工作。

谢谢。

4

3 回答 3

1

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

于 2009-10-19T05:59:19.173 回答
0

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

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

3e2f9d9069abd6ace2cb18f7390a06c034a0f9dd

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

于 2009-10-19T01:14:45.807 回答
0

我怀疑存储在文件中的旧哈希可能不正确。在每台机器上试用一个简单的控制台应用程序片段。就像是:

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

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

还有一件事要注意;我看到您正在使用 bool validHash 来存储比较结果,但是之后检查 boolean validSource。这只是打字错误吗?

于 2009-10-19T03:10:01.937 回答