升级到.NET 4.5之后,我现在得到警告说,“System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile已经过时”和建议是使用会员的API来代替。
这一切都非常好,好为新项目,但在这个阶段(用户数据和散列现有密码),我不能很好地更改为自定义成员提供与散列的潜在不同的方式。
请告诉我推荐的方法前进了这样的问题? 继续使用“过时”的要求显然是不建议的路径,所以一直也被替换为不是“只使用会员的API”别的其他?
这是SHA1变体的解决方案。
public static string GetSwcSHA1(string value)
{
SHA1 algorithm = SHA1.Create();
byte[] data = algorithm.ComputeHash(Encoding.UTF8.GetBytes(value));
string sh1 = "";
for (int i = 0; i < data.Length; i++)
{
sh1 += data[i].ToString("x2").ToUpperInvariant();
}
return sh1;
}
对于MD5你只需要改变算法:
MD5 algorithm = MD5.Create();
希望你不介意,只是要添加上述代码的变种VB.NET:
Public Shared Function CreateHash(saltAndPassword) As String
Dim Algorithm As SHA1 = SHA1.Create()
Dim Data As Byte() = Algorithm.ComputeHash(Encoding.UTF8.GetBytes(saltAndPassword))
Dim Hashed As String = ""
For i As Integer = 0 To Data.Length - 1
Hashed &= Data(i).ToString("x2").ToUpperInvariant()
Next
Return Hashed
End Function
请告诉我推荐的方法前进了这样的问题? 继续使用“过时”的要求显然是不建议的路径,所以一直也被替换为不是“只使用会员的API”别的其他?
最好的方法(你已经排除了)纯内的.NET框架是改变一切到有通过PBKDF2,Bcrypt,或Scrypt散列密码。 PBKDF2在.NET通过所提供的Rfc2898DeriveBytes类 。
第二个最好的办法是使用密码的两个“版本”,以结束:
- 版本0本来是老HashPasswordForStoringInConfigFile,但你可以更新那些块状的,离线,以第1版,并删除所有那些老哈希之前有人偷了他们,你在交易消息最终成为具有可悲90年代复古的密码哈希。
- 版本1,这是现有HashPasswordForStoringInConfigFile值的PBKDF2! 即你把你目前的肮脏旧散列,并用新的随机盐和迭代次数的PBKDF2他们,并存储结果。 然后,当用户试图登录时,你喂他们的密码的代码@RichardBažant写道,所以你有什么HashPasswordForStoringInConfigFile将返回, 然后应用PBKDF2到的结果!
- 也就是说,它实际上是Rfc2898DeriveBytes(HashPasswordForStoringInConfigFile(密码)),PerUserSalt,YourIterations)
- 第2版,这谁拥有版本1散列用户都升级到。 除“版本”的所有列都是相同的,但你计算和验证版本1之后,然后你计算Rfc2898DeriveBytes(密码),PerUserSalt,YourIterations)并更换版本1散列与第2版的哈希值(和变化版本2,当然)。
第三个最好的办法是第二个最好的方式,但只有版本1.请注意,这样就在于DCC2疯狂-你保持包装新算法里面旧输出
在这两种情况下,你会在数据库中存储PBKDF2-HMAC-SHA-1的结果,所以你需要:
- 密码哈希(BINARY(20)) - 即在PBKDF2输出。
- 您的盐(BINARY(16),由每个用户生成RNGCryptoServiceProvider类 )
- 可选:PBKDF2迭代次数(INT,开始在数以万计的,至多到之前你的服务器将被CPU限制在最大负荷;随着硬件升级)
- 这可以让你的每一个用户输入他们的(正确的)password.by时间增加透明的安全级别第一验证它是正确的,然后用更高的迭代次数重新哈希处理
- 可选:A“版”(TINYINT),以便升级到另一种算法后是比较容易的,因为你可以有多个版本一次激活。
PS为版本1或2版更新algorith,Jither创建能够PBKDF2-HMAC-SHA256,PBKDF2-HMAC-SHA512,等等的NET库; 我Github上库 ,包含了一个合理的组测试向量的变体。
理查德的回答为我工作的伟大。 这是代码的.NET Framework 4.5去编译。 如果任何人的东西岂不是更好,请使用它。 我想这可能有点快。
public static string BinaryToHex(byte[] data)
{
if (data == null)
{
return null;
}
char[] hex = new char[checked((int)data.Length * 2)];
for (int i = 0; i < (int)data.Length; i++)
{
byte num = data[i];
hex[2 * i] = NibbleToHex((byte)(num >> 4));
hex[2 * i + 1] = NibbleToHex((byte)(num & 15));
}
return new string(hex);
}
private static char NibbleToHex(byte nibble)
{
int aChar = (nibble < 10 ? nibble + 48 : nibble - 10 + 65);
return (char)aChar;
}
为什么不能利用.NET中最简单的一个
public static string HashString(string inputString, string hashName)
{
var algorithm = HashAlgorithm.Create(hashName);
if (algorithm == null)
throw new ArgumentException("Unrecognized hash name", hashName);
byte[] hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
return Convert.ToBase64String(hash);
}
文章来源: Drop in replacement for FormsAuthentication.HashPasswordForStoringInConfigFile?