gpt4 book ai didi

c# - C# 中的哈希密码和盐密码

转载 作者:行者123 更新时间:2023-11-29 20:17:57 25 4
gpt4 key购买 nike

我刚刚浏览了 DavidHayden 关于 Hashing User Passwords 的一篇文章.

我真的无法理解他想要达到的目标。

这是他的代码:

private static string CreateSalt(int size)
{
//Generate a cryptographic random number.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);

// Return a Base64 string representation of the random number.
return Convert.ToBase64String(buff);
}

private static string CreatePasswordHash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
string hashedPwd =
FormsAuthentication.HashPasswordForStoringInConfigFile(
saltAndPwd, "sha1");
return hashedPwd;
}

还有其他 C# 方法可以对密码进行哈希处理并向其添加盐吗?

最佳答案

实际上,这有点奇怪,因为字符串转换 - 成员资格提供者将它们放入配置文件中。哈希和盐是二进制 blob,不需要将它们转换为字符串,除非您想将它们放入文本文件中。

在我的书中,Beginning ASP.NET Security ,(哦,最后,一个为这本书拉皮条的借口)我做了以下事情

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
HashAlgorithm algorithm = new SHA256Managed();

byte[] plainTextWithSaltBytes =
new byte[plainText.Length + salt.Length];

for (int i = 0; i < plainText.Length; i++)
{
plainTextWithSaltBytes[i] = plainText[i];
}
for (int i = 0; i < salt.Length; i++)
{
plainTextWithSaltBytes[plainText.Length + i] = salt[i];
}

return algorithm.ComputeHash(plainTextWithSaltBytes);
}

盐的生成如问题中的例子。您可以使用 Encoding.UTF8.GetBytes(string) 将文本转换为字节数组。如果您必须将哈希转换为其字符串表示形式,则可以使用 Convert.ToBase64StringConvert.FromBase64String 将其转换回来。

您应该注意,您不能在字节数组上使用相等运算符,它会检查引用,因此您应该简单地循环遍历两个数组来检查每个字节

public static bool CompareByteArrays(byte[] array1, byte[] array2)
{
if (array1.Length != array2.Length)
{
return false;
}

for (int i = 0; i < array1.Length; i++)
{
if (array1[i] != array2[i])
{
return false;
}
}

return true;
}

始终为每个密码使用新的盐。盐不必保密,可以与哈希本身一起存储。

关于c# - C# 中的哈希密码和盐密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39639119/

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