什么是ASP.NET成员使用默认的哈希算法? 我怎样才能改变呢?
Answer 1:
编辑:请不要使用会员提供的,是因为它是horridly不足以保护用户的密码条款
在的事实,光谷歌搜索“成员提供散列算法”变成了这个答案的第一个结果,那将被推断的福音,它理应我警告使用成员资格提供这样和使用哈希像人们SHA-1 ,MD5等混淆在数据库中的密码。
TL;博士
使用像bcrypt,scrypt或者(如果你需要符合FIPS)PBKDF2一键导出函数与工作因素足以必要的哈希时间一个密码,以尽可能接近1000MS以上。
哈希很容易蛮力这些天与数据泄露的足够例子在最近的历史。 为了防止您的用户密码,从在未来黑客引擎收录结束了,确保密码与需要足够长的时间来计算散列函数!
相反,成员资格提供,尽量IdentityReboot或者从微软新的实现,特洛伊亨特挂在嘴边的最少。
这也是有趣的是,上面我所提到的相同的谷歌搜索结果找到一个展示人们很珍贵多么容易教程蛮力使用流行的工具,如JTR或Hashcat这些密码哈希值。 在定制GPU钻机,SHA1可以在一个被破解的每秒 488.67 亿哈希惊人的速度! 有了自由字典像RockYou的或类似的 ,一个积极的人与你的数据库将很快拥有大多数用户的密码。 作为一个开发者,这是你的道德责任,做什么是必要的,以保护您的用户密码的安全性。
默认散列是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
这太问题将有助于扭转或复制这个技术,如果这是可能需要的东西。 重新实现ASP.NET成员资格和用户密码的散列红宝石
如果你是一个定制的提供者,你可以创建你的散列算法和加密算法和方法。
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
Answer 2:
在由Ryan克里斯滕森上面的回答是不完整的。 它的盐转换为字节[]的部分是不正确的。
这是我在为客户解决方案已经实现了一个工作示例:
public string Hash(string value, string salt)
{
byte[] bytes = Encoding.Unicode.GetBytes(value);
byte[] src = Convert.FromBase64String(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);
}
Answer 3:
默认的哈希算法类型是SHA1。 有迹象表明,你可以改变这两种方式。
1)如果您正在使用IIS 7工作,就可以使用“计算机密钥”配置(如下图所示)更新此。 这使您可以选择从可用选项列表中的加密方法,并指定密钥或密钥生成选项。
2)如果您正在使用IIS 6工作,就可以使用会员元素在web.config文件来改变散列算法类型:
<membership
defaultProvider="provider name"
userIsOnlineTimeWindow="number of minutes"
hashAlgorithmType="SHA1">
<providers>...</providers>
</membership>
根据文档的的字符串值hashAlgorithmType属性可以是任何所提供的.Net散列算法类型。 挖掘的比特表明,对于ASP.Net 2,3和3.5的有效值是MD5
, RIPEMD160
, SHA1
, SHA256
, SHA384
, SHA512
。 这里最重要的是,所有这些类继承HashAlgorithm
。
所述的值hashAlgorithmType属性也可以是从一个条目cryptoNameMapping元件在machine.config文件。 如果你需要一个第三方散列算法,您可以使用此。 Machine.config文件通常可以中找到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG
如果您正在使用ASP.Net 2或更高版本。 你可以阅读更多有关设置这些值在这里 。
Answer 4:
默认的哈希算法在.NET 4.0框架改为HMACSHA256。
请注意,与SHA-1,HMAC SHA-256加密散列。 如果你的散列行为不确定性,你可能还没有设置一个按键,迫使它使用一个随机。 一些类似于以下会是罪魁祸首(这是我只花了一个小时搞清楚:P)。
HashAlgorithm.Create(Membership.HashAlgorithmType)
如果你想拥有它与现有供应商合作,你可以将其恢复到使用前的默认值本指南 。
Answer 5:
有一个在散列算法一个修正,则必须使用:
byte[] src = Convert.FromBase64String(salt);
代替
byte[] src = Encoding.Unicode.GetBytes(salt);
阅读文章http://svakodnevnica.com.ba/index.php?option=com_kunena&func=view&catid=4&id=4&Itemid=5&lang=en#6
Answer 6:
我附上表示作为Rawbert的答案代码片段上面F#
open System
open System.Security.Cryptography
open System.Text
module PasswordHelper =
let EncodePassword(pass : string, salt : string) =
let bytes = Encoding.Unicode.GetBytes(pass)
let src = Convert.FromBase64String(salt)
let dst : byte array = Array.zeroCreate (src.Length + bytes.Length)
Buffer.BlockCopy(src, 0, dst, 0, src.Length)
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length)
let algorithm = HashAlgorithm.Create("SHA1")
let inArray = algorithm.ComputeHash(dst)
Convert.ToBase64String(inArray)
从活跃应用这是工作的代码