C# Vista和XP中的SHA1哈希不同
在使用C#.NET 2.0(在Vista上)的WinForm应用程序中,我使用SHA1哈希从字符串创建哈希,并将哈希存储在文本文件中(使用UTF-8编码)。我想使用存储在文本文件中的散列来解决一个问题。当我在Vista中运行项目时,它工作正常(即条件结果为true),但当我在XP中运行项目时,项目不会运行 Vista中创建哈希的方式与XP不同吗 代码摘录C# Vista和XP中的SHA1哈希不同,c#,.net-2.0,hash,sha1,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
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中。如果有逻辑的话
问题:它不应该在任何操作系统中工作
谢谢 我很好奇为什么您提到UTF-8编码与在文本文件中存储哈希值有关。您是在尝试存储原始数据字节(以某种方式转换为UTF-8),还是在存储哈希值的十六进制表示形式 通常,在文本文件中存储哈希值时,您会使用十六进制表示法,例如:
3e2f9d9069abd6ace2cb18f7390a06c034a0f9dd
没有必要专门使用UTF-8编码,因为上面的是普通的ASCII。我很好奇,为什么您提到UTF-8编码与在文本文件中存储哈希值有关。您是在尝试存储原始数据字节(以某种方式转换为UTF-8),还是在存储哈希值的十六进制表示形式 通常,在文本文件中存储哈希值时,您会使用十六进制表示法,例如:
3e2f9d9069abd6ace2cb18f7390a06c034a0f9dd
没有必要专门使用UTF-8编码,因为上面的是普通的ASCII。我怀疑文件中存储的旧哈希可能不正确。在每台机器上尝试一个简单的控制台应用程序片段。比如:
Console.WriteLine(Program.GetHash("This will be hashed."));
如果这些确实给出了相同的结果,那么这一定与比较例程有关(即,上面提到的oldHash)
还有一件事需要注意;我看到您正在使用bool validHash来存储比较结果,但随后检查布尔值validSource。这只是输入错误吗?我怀疑文件中存储的旧哈希可能不正确。在每台机器上尝试一个简单的控制台应用程序片段。比如:
Console.WriteLine(Program.GetHash("This will be hashed."));
如果这些确实给出了相同的结果,那么这一定与比较例程有关(即,上面提到的oldHash)
还有一件事需要注意;我看到您正在使用bool validHash来存储比较结果,但随后检查布尔值validSource。这只是输入错误吗?如何在机器之间传递二进制文件?有一次,当我在我的机器上准备ClickOnce包时,用7zip提供的最大压缩模式压缩二进制文件并在另一端用winzip解压二进制文件时,我遇到了一个哈希验证问题。如何在机器之间传递二进制文件?有一次,当我在我的机器上准备ClickOnce包时,用7zip提供的最大压缩模式压缩二进制文件并在另一端用winzip解压时,我遇到了一个哈希验证问题。你能发布你正在使用的代码吗?你也能发布实现“条件”的代码吗你在问题中提到了什么?另外,您是否检查了每个平台上相同的
strPlain
输入值的MessageBytes
是否相同?谢谢。是,strPlain值相同。我使用了一个简单的句子“This will be hash.”RegardsI的意思是在调用输入值上的Encoding.UTF8.GetBytes()
后检查MessageBytes
值。我相信您已经在使用相同的strPlain
输入值。如果它没有按照您的预期工作,那么您的预期是可疑的。检查一切!你可以发布你正在使用的代码吗?你也可以发布实现你在问题中提到的“条件”的代码吗?另外,您是否检查了每个平台上相同的strPlain
输入值的MessageBytes
是否相同?谢谢。是,strPlain值相同。我使用了一个简单的句子“This will be hash.”RegardsI的意思是在调用输入值上的Encoding.UTF8.GetBytes()
后检查MessageBytes
值。我相信您已经在使用相同的strPlain
输入值。如果它没有按照您的预期工作,那么您的预期是可疑的。检查一切!谢谢我使用十六进制表示,如上所示。UTF-8是导致问题的原因吗?重新考虑不太可能是UTF-8导致了您的问题。你能把你用的代码贴出来吗?谢谢。我使用十六进制表示,如上所示。UTF-8是导致问题的原因吗?重新考虑不太可能是UTF-8导致了您的问题。你能发布你正在使用的代码吗?谢谢你指出validSource。我已经改正了。只是打字错误。雷加西Console.WriteLine(Program.GetHash(“这将被散列”)代码>在XP和Vista中给出不同的结果。不知道为什么,因为这两种情况下的代码是相同的。感谢您指出validSource。我已经改正了。只是打字错误。雷加西Console.WriteLine(Program.GetHash(“这将被散列”)代码>在XP和Vista中给出不同的结果。不知道为什么,因为这两种情况下的代码是相同的。