【问题标题】:C# Hashing Base64 encoded string lengthC# Hashing Base64 编码的字符串长度
【发布时间】: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。

标签: c# hash base64


【解决方案1】:

您可以将哈希转换为十六进制,然后对其进行 base64 编码:

using PCLCrypto;
using System;
using System.Text;

namespace SOcrypto
{
    class Program
    {
        static string Hex(byte[] bb)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bb.Length; i++)
            {
                sb.Append(bb[i].ToString("X2"));
            }
            return sb.ToString();
        }

        static void Main(string[] args)
        {
            var testData = Encoding.Unicode.GetBytes("Hello, World!");
            var cryptoProvider = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Sha256);
            var hash_VA = cryptoProvider.HashData(testData);

            Console.WriteLine("hash_VA.Length = " + hash_VA.Length);

            var asHex = Hex(hash_VA);
            var asB64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(asHex));

            Console.WriteLine("asB64.Length = " + asB64.Length);

            Console.ReadLine();

        }
    }
}

输出:

hash_VA.Length = 32
asB64.Length = 88

【讨论】:

  • @Downvoter 请解释这有什么问题。它执行 OP 手动执行的操作。
  • 不确定否决票(我还没有测试过),但算法模式可能会产生一些填充问题。看看这是否可以提供有关此事的一些线索:System.Security.Cryptography vs PCLCrypto.
  • @Jimi 该链接中的填充适用于加密/解密,而不是哈希。
  • 是的,不完全是我提出该链接的原因,但我可以用您的代码确认,这些就是结果。使用ToBase64Transform 的测试返回一个44 字节的字符串(不同于Convert.ToBase64String())。但是,在这种情况下,十六进制转换返回一个 52 字符的字符串和(以防万一)一个 120 字节的 URLEncoded 字符串。因此,您的代码返回的值可能代表正确的结果。
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 2010-11-27
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多