C#散列Base64编码的字符串长度

时间:2018-07-18 16:50:31

标签: c# hash base64

我正在对文件的二进制内容进行哈希处理,然后将哈希值与该文件的内容一起发送到第三方Web服务。他们将验证哈希与文件是否匹配。

我正在使用WinRTCrypto.HashAlgorithmProvider和SHA-256算法

var cryptoProvider = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Sha256);
var hash_VA = this.cryptoProvider.HashData(this.DocumentBytes);

hash_VA导致一个32字节的字节数组。如果我将其转换为基数64

var hashBase64_VA = Convert.ToBase64String(hash_VA);

我得到的字符串长度为 44 个字符。麻烦的是,第3个Web服务正在获取 88 个字符的基数64哈希。

如果我将字节转换为十六进制,则会得到 64 个字符

BitConverter.ToString(this.cryptoProvider.HashData(bytesFromHex)).Replace("-", String.Empty)

64但是不是88,但是如果我使用该十六进制字符串,例如

DBA70AB40B20A4F09C15A5908D31360F39CFBF20A0458F49641B0D9670689985

并将其放入https://www.base64encode.org/中,它确实将其编码为88个字符。

如何在C#中生成基于88个字符的64个字符串?我显然在这里缺少一些基本知识

1 个答案:

答案 0 :(得分:0)

您可以将哈希转换为十六进制,然后对它进行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