计算哈希似乎与 SHA256 错误

Posted

技术标签:

【中文标题】计算哈希似乎与 SHA256 错误【英文标题】:Computed Hash seems to be wrong with 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。 感谢您的建议,我一定会看看! 【参考方案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,因为前者产生小写编码值而不是大写。

以上是关于计算哈希似乎与 SHA256 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?

使用OpenSSL计算并打印文件的SHA256哈希值

比特币背后的算法与数学

使用 Crypto++ 生成 SHA256 哈希,使用字符串作为输入和输出?

是否可以使用用户的视频卡在浏览器中计算sha256哈希值,例如。使用WebGL或Flash?

如何将 powershell 中文件的 SHA256 哈希值与已知值进行比较?附加问题