gpt4 book ai didi

asp.net - ASP.NET 成员资格使用的默认哈希算法是什么?

转载 作者:行者123 更新时间:2023-12-03 01:38:00 26 4
gpt4 key购买 nike

ASP.NET 成员资格使用的默认哈希算法是什么?我该如何更改它?

最佳答案

编辑:不要按原样使用成员(member)提供程序,因为它在保护用户密码方面严重不足

鉴于 googling "membership provider hashing algorithm"出现这个答案作为第一个结果,以及将推断的福音,我有必要警告人们不要像这样使用成员(member)提供程序并使用 SHA-1、MD5 等哈希来混淆数据库中的密码。

tl;博士

<强> Use a key-derivation function like bcrypt, scrypt or (if you need FIPS compliance) PBKDF2工作因素足以使单个密码的哈希时间接近 1000 毫秒或更长。

如今,哈希很容易被暴力破解,近代历史上有大量数据泄露的例子。为了防止您的用户密码在下一次黑客攻击中最终出现在 Pastebin 上,请确保使用需要足够长的时间来计算的函数对密码进行哈希处理!

尝试使用 IdentityReboot 而不是成员(member)提供商或newer implementations from Microsoft that Troy Hunt talks about至少。

同样有趣的是,在上面提到的相同谷歌结果中,我发现了 tutorial showing folks preciously how easy it is使用 JtR 或 Hashcat 等流行工具来暴力破解这些密码哈希。在定制 GPU 装备上,SHA1 可以在 staggering rate of 48867 million hashes per second! 处被破解。使用像 rockyou or the like 这样的免费词典,一个有动机的人会很快拥有您的数据库的大部分用户密码。作为开发人员,您有道德责任采取必要措施来保护用户密码的安全。

<小时/>

默认的散列是 SHA1,但他们也对它加盐并对它进行 base64:

public string EncodePassword(string pass, string salt)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Encoding.Unicode.GetBytes(salt);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}

如果您想了解更多有关如何更改它的信息,我仍然需要了解(除非使用自定义提供程序,请参见下文),但 SHA-1 目前相当不错。如果您想反转它或从中查找,这些人做了一些工作:http://forums.asp.net/p/1336657/2899172.aspx

如果可能需要的话,这个问题将有助于逆转或复制这种技术。 Reimplement ASP.NET Membership and User Password Hashing in Ruby

如果您要创建自定义提供程序,您可以创建散列和加密算法和方法。

private byte[] ConvertPasswordForStorage(string Password)
{
System.Text.UnicodeEncoding ue =
new System.Text.UnicodeEncoding();
byte[] uePassword = ue.GetBytes(Password);
byte[] RetVal = null;
switch (_PasswordFormat)
{
case MembershipPasswordFormat.Clear:
RetVal = uePassword;
break;
case MembershipPasswordFormat.Hashed:

HMACSHA1 SHA1KeyedHasher = new HMACSHA1();
SHA1KeyedHasher.Key = _ValidationKey;
RetVal = SHA1KeyedHasher.ComputeHash(uePassword);
break;
case MembershipPasswordFormat.Encrypted:
TripleDESCryptoServiceProvider tripleDes = new
TripleDESCryptoServiceProvider();
tripleDes.Key = _DecryptionKey;
tripleDes.IV = new byte[8];
MemoryStream mStreamEnc = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(mStreamEnc,
tripleDes.CreateEncryptor(),
CryptoStreamMode.Write);

cryptoStream.Write(uePassword, 0, uePassword.Length);
cryptoStream.FlushFinalBlock();
RetVal = mStreamEnc.ToArray();
cryptoStream.Close();
break;

}
return RetVal;
}

private string GetHumanReadablePassword(byte[] StoredPassword)
{
System.Text.UnicodeEncoding ue = new System.Text.UnicodeEncoding();
string RetVal = null;
switch (_PasswordFormat)
{
case MembershipPasswordFormat.Clear:
RetVal = ue.GetString(StoredPassword);
break;
case MembershipPasswordFormat.Hashed:
throw new ApplicationException(
"Password cannot be recovered from a hashed format");

case MembershipPasswordFormat.Encrypted:
TripleDESCryptoServiceProvider tripleDes =
new TripleDESCryptoServiceProvider();
tripleDes.Key = _DecryptionKey;
tripleDes.IV = new byte[8];
CryptoStream cryptoStream =
new CryptoStream(new MemoryStream(StoredPassword),
tripleDes.CreateDecryptor(), CryptoStreamMode.Read);
MemoryStream msPasswordDec = new MemoryStream();
int BytesRead = 0;
byte[] Buffer = new byte[32];
while ((BytesRead = cryptoStream.Read(Buffer, 0, 32)) > 0)
{
msPasswordDec.Write(Buffer, 0, BytesRead);

}
cryptoStream.Close();

RetVal = ue.GetString(msPasswordDec.ToArray());
msPasswordDec.Close();
break;
}
return RetVal;
}

http://msdn.microsoft.com/en-us/library/aa479048.aspx

关于asp.net - ASP.NET 成员资格使用的默认哈希算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1137368/

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