SHA256 字符串的 Base64 编码

0 c# base64 sha256

我目前正在用 C# 做一个程序。当我尝试将字符串从 sha256 传递到 base64 时,我意识到它没有正确编码。

例如,给定 sha256

cd69ef0284bba33bc0b320e6479c2da2d411a5e46af060d8639f0e0bfc24f26d
Run Code Online (Sandbox Code Playgroud)

我的代码产生

Y2Q0Q2OUVGMDI4NEJCQTMzQkMwQjMyMEU2NDc5QzJEQTJENDExQTVFNDZBRjA2MEQ4NjM5RjBFMEJGQzI0RjI2RA==
Run Code Online (Sandbox Code Playgroud)

我期待得到的是

zWnvAoS7ozvAsyDmR5wtotQRpeRq8GDYY58OC/wk8m0
Run Code Online (Sandbox Code Playgroud)

为什么编码的字符串如此不同,我错过了什么?

这是我正在使用的代码

string t1 ="cd69ef0284bba33bc0b320e6479c2da2d411a5e46af060d8639f0e0bfc24f26d";
var t2= System.Text.Encoding.GetEncoding(1252).GetBytes(t1);                                
string t3= System.Convert.ToBase64String(t2);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

SHA-256 的输出是一个二进制值,通常表示为一个字节数组。您已将其转换为十六进制字符串,然后对该十六进制字符串进行 base64 编码。

相反,您应该对原始二进制数据进行 base64 编码,而不是先将其转换为十六进制。

如果您必须首先通过十六进制,您应该将其解析回原始字节,然后对结果进行base64 编码:

using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        string text = "cd69ef0284bba33bc0b320e6479c2da2d411a5e46af060d8639f0e0bfc24f26d";
        byte[] data = ParseHex(text);
        Console.WriteLine(Convert.ToBase64String(data));
    }

    // Taken from /sf/ask/55651921/#795036
    static byte[] ParseHex(string text)
    {
        Func<char, int> parseNybble = c => (c >= '0' && c <= '9') ? c-'0' : char.ToLower(c)-'a'+10;
        return Enumerable.Range(0, text.Length/2)
            .Select(x => (byte) ((parseNybble(text[x*2]) << 4) | parseNybble(text[x*2+1])))
            .ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

...但最好不要将哈希转换为十六进制开始。