Encoding.UTF8.GetBytes() 给出与转换为字符串之前不同的值

问题描述 投票:0回答:1

我正在尝试编写密码散列代码并遇到散列方法问题,然后创建此测试代码以查看到底发生了什么。

该方法首先使用

byte
生成密码盐和散列作为
HMACSHA512
数组,然后将这两个值转换为字符串,然后将它们转换回
byte
数组。

string password = "xxx";

byte[] pswSalt;
byte[] pswHash;

using (HMACSHA512 hmac = new HMACSHA512())
{
    pswSalt = hmac.Key;
    pswHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
}

var saltAsString = Encoding.UTF8.GetString(pswSalt);
var hashAsString = Encoding.UTF8.GetString(pswHash);

var pswSaltFromString = Encoding.UTF8.GetBytes(saltAsString);
var pswHashFromString = Encoding.UTF8.GetBytes(hashAsString);

令我惊讶的是,最终的字节数组与原始字节数组不同。这是为什么?我该如何纠正这个问题?

c# .net encryption password-hash sha512
1个回答
0
投票

任意字节序列无法转换为 Unicode 并返回。一些字节序列作为 Unicode 无效,一些可能被规范化为不同的序列。

如果确实需要用字符串表示字节,可以使用Base64

请注意,您可以将字节数组存储在数据库中,因此您不需要为此目的使用字符串,例如,在 MySQL 中,您可以使用

VARBINARY
数据库类型。

© www.soinside.com 2019 - 2024. All rights reserved.