在使用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中。如果有一些逻辑 问题它不适用于任何操作系统。
感谢。
答案 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。这只是一个错误吗?