【问题标题】:Computed Hash seems to be wrong with SHA256计算哈希似乎与 SHA256 错误
【发布时间】:2021-11-25 21:15:48
【问题描述】:

我有以下类计算我要发送到服务器的文件的哈希值。

public class GetHashCode 
    {
        public static string CalculateHash()
        {
            try
            {
                var filePath = "\\\\abc\\abc-fs\\_My-Data\\user\\Documents\\test.jpg";
                var fileStream = File.Open(filePath, FileMode.Open,
                FileAccess.Read, FileShare.ReadWrite);
                var hashProvider = SHA256.Create();
                var buffer = hashProvider.ComputeHash(fileStream);
                return Convert.ToBase64String(buffer);
            }
            catch (Exception err)
            {
                Console.WriteLine(err);
                return null;
            }        
        }
    }

当我通过另一个应用程序将文件发送到服务器时,我可以看到此操作的哈希与我使用上面的代码创建的哈希有点不同:

来自其他应用程序的哈希(正确的):

R7av4w6Ow3M3z%252bpKPBBpojzvLvyl6aM0Q7q%252bJ%252fDvLPQ%253d

使用我的代码生成的哈希:

R7av4w6Ow3M3z+pKPBBpojzvLvyl6aM0Q7q+J/DvLPQ=

所以好像特殊字符的编码有问题,但是我还不知道怎么解决。有人可以帮忙吗?提前致谢!

【问题讨论】:

  • 注意:This:catch (Exception err) { Console.WriteLine(err); return null; } 是一种反模式,因为它隐藏了问题并使调试更加困难。如果在哈希生成过程中出现问题,您希望程序因“真正的”异常而崩溃,而不是因为方法返回 null 而遇到一些难以诊断的后续错误。如果您有时间,请阅读"fail early" concept
  • 感谢您的建议,我一定会看看!

标签: c# hash sha256


【解决方案1】:

你的哈希没问题。

另一个应用程序的哈希似乎是 URL 编码的......两次!应用 URL 解码(例如使用WebUtility.UrlDecode)两次似乎可以解决它。

R7av4w6Ow3M3z%252bpKPBBpojzvLvyl6aM0Q7q%252bJ%252fDvLPQ%253d

-> URLDecode

R7av4w6Ow3M3z%2bpKPBBpojzvLvyl6aM0Q7q%2bJ%2fDvLPQ%3d

-> URLDecode

R7av4w6Ow3M3z+pKPBBpojzvLvyl6aM0Q7q+J/DvLPQ=

【讨论】:

  • 好的,其他应用程序的哈希是 REST 响应的一部分,我忘了提及。所以哈希显然不是我的问题。
  • 嗯,也许问题仍然与哈希有关。我想以相反的方式进行测试:对我的哈希进行编码,使其具有其他应用程序哈希的形式。 UrlEncode 没有提供预期的结果,你知道怎么做吗?
  • @schmimla:应用 UrlEncode 两次对我有用:dotnetfiddle.net/gmKBR4。请注意,我使用HttpUtility.UrlEncode 而不是WebUtility.UrlEncode,因为前者产生小写编码值而不是大写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2016-08-03
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
相关资源
最近更新 更多