【发布时间】:2018-07-18 16:50:30
【问题描述】:
我正在对文件的二进制内容进行哈希处理,并将哈希值与该文件的内容一起发送到第 3 方 Web 服务。他们将验证哈希是否与文件匹配。
我正在使用 WinRTCrypto.HashAlgorithmProvider 和 SHA-256 算法
var cryptoProvider = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Sha256);
var hash_VA = this.cryptoProvider.HashData(this.DocumentBytes);
hash_VA 生成一个 32 字节的字节数组。如果我将其转换为 base 64
var hashBase64_VA = Convert.ToBase64String(hash_VA);
我得到一个长度为 44 个字符的字符串。问题是第 3 个 Web 服务正在获取 88 个字符的 base 64 哈希。
如果我将字节转换为十六进制,我会得到 64 个字符
BitConverter.ToString(this.cryptoProvider.HashData(bytesFromHex)).Replace("-", String.Empty)
64 不是 88,但是如果我采用 HEX 字符串,例如
DBA70AB40B20A4F09C15A5908D31360F39CFBF20A0458F49641B0D9670689985
并将其放入https://www.base64encode.org/ 中,它会将其编码为 88 个字符。
如何在 C# 中生成 88 个字符的 base 64 字符串?我显然在这里缺少一些基础知识
【问题讨论】:
-
除非非字母数字字符“=”、“/”和“=”存在问题,否则对 Base64 编码进行十六进制编码是没有理由的,也没有任何意义。有使用其他字符非字母数字字符的替代 Base64 编码。
-
您应该询问第三方网络服务提供商他们如何计算哈希值。
-
我有并且我有来自该验证的来源。我似乎在做相反的事情,但显然不是
-
你确定他们没有使用 SHA-512?
-
是的,绝对是 SHA 256。