gpt4 book ai didi

c# - 散列和 GetString/GetBytes 问题

转载 作者:行者123 更新时间:2023-11-30 19:42:58 25 4
gpt4 key购买 nike

我有以下代码来散列/存储/检索密码数据,但我的第一个单元测试失败了。

我相信是编码导致了问题,因为当调用 GetBytes 时它返回 byte[38]byte[36] 我认为它应该是 20。

我必须将其转换为字符串,因为我将其存储在数据库中。

有什么想法吗?谢谢

[Fact]
public void EncryptDecryptPasswordShouldMatch()
{
string password = "password";
string passwordKey = string.Empty;
string passwordSalt = string.Empty;

Helpers.CreatePasswordHash(password, out passwordSalt, out passwordKey);

Assert.True(Helpers.PasswordsMatch(passwordSalt, passwordKey, password));

}


public static bool PasswordsMatch(string passwordSalt, string passwordKey, string password)
{
byte[] salt = Encoding.UTF8.GetBytes(passwordSalt);
byte[] key = Encoding.UTF8.GetBytes(passwordKey);

using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
{
byte[] newKey = deriveBytes.GetBytes(20); // derive a 20-byte key

if (!newKey.SequenceEqual(key))
return false;
}

return true;
}

public static void CreatePasswordHash(string password, out string passwordSalt, out string passwordKey)
{
// specify that we want to randomly generate a 20-byte salt
using (var deriveBytes = new Rfc2898DeriveBytes(password, 20))
{
byte[] salt = deriveBytes.Salt;
byte[] key = deriveBytes.GetBytes(20); // derive a 20-byte key

passwordSalt = Encoding.UTF8.GetString(salt);
passwordKey = Encoding.UTF8.GetString(key);
}
}

最佳答案

使用Base64将二进制值编码为字符串,可以处理任意字节序列。 UTF-8 用于 unicode 文本和字节之间的转换,并非每个有效的字节序列都对 UTF-8 有效。使用 Utf-8 将密码(文本)转换为字节,但使用 Base64 进行 salt 和 hash。

Convert.ToBase64StringConvert.FromBase64String应该可以解决问题。


一些补充说明:

  • 你的术语真的很奇怪,不要称哈希为key,称其为hash
  • 我会在您的 CreatePasswordHash 函数中连接哈希和盐,因此调用者不必为拥有两个单独的值而烦恼。

    类似return Base64Encode(salt)+"$"+Base64Encode(hash) 然后在验证函数中使用string.Split

  • 建议使用恒定时间比较来验证,但您的计时侧信道似乎不太可能真正被利用。

  • 您的迭代次数非常少。我建议将其增加到 10000。

关于c# - 散列和 GetString/GetBytes 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com