我想知道在MVC 5和ASP.NET Identity Framework附带的UserManager中默认实现的Password Hasher是否足够安全?如果是这样,如果你可以向我解释它是如何工作的?
IPasswordHasher界面如下所示:
public interface IPasswordHasher
{
string HashPassword(string password);
PasswordVerificationResult VerifyHashedPassword(string hashedPassword,
string providedPassword);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它不需要盐,但在这个帖子中提到:" Asp.net身份密码哈希 ",它确实在幕后加盐.所以我想知道它是如何做到的?这盐来自何处?
我担心的是盐是静态的,使它非常不安全.
在我的ASP.NET应用程序中,我在web.config中的DefaultMembershipProvider和SqlMembershipProvider中有以下设置:
enablePasswordRetrieval="true"
passwordFormat="Clear"
requiresQuestionAndAnswer="false"
Run Code Online (Sandbox Code Playgroud)
它们是摘要式身份验证所必需的.我想转向ASP.NET身份.我正在使用自动化工具来更新我管理的所有web.config文件.
如何在Visual Studio 2013生成的项目中为ASP.NET Identity设置这些设置?
asp.net asp.net-membership sqlmembershipprovider visual-studio-2013 asp.net-identity
我创建了一个简单的MVC4应用程序并注册了一个用户.usrname和密码存储在名为AspNetUsers的表中.该表没有盐场.
我理解的方式是当用户登录时; 他们输入用户名和密码.然后将盐与输入的密码连接起来,并与数据库中的密码进行比较.这不正确吗?即
Hash(PasswordEntered) + Salt = Password in database = authenticated
Hash(PasswordEntered) + Salt <> Password in database = not authenticated
Run Code Online (Sandbox Code Playgroud)
有一个名为:aspnetusers.SecurityStamp的字段,但我的研究告诉我,这不是Salt.
更新
我刚读过Scott Chamberlain.请参阅以下步骤:
1)用户在注册期间输入:Hello123作为密码,Salt(随机生成)为:456,然后输入PasswordHash的密码为:Hello123 + 456 2)然后用户尝试登录并输入Hello123(正确)作为密码.盐(随机生成)为:567.因此Hello123 + 456与Hello123 + 567进行比较,验证失败.
在这种情况下,用户输入正确的密码并且未经过身份验证.我显然缺少一些基本的东西.
我有一个项目,我们需要将许多用纯文本密码的用户迁移到一个新的数据库中,我们将对密码进行哈希处理.
新系统使用Entity Framework,需要使用Asp.Net Identity框架进行身份验证.
我发现我可以在C#中生成一个正确的哈希密码,Entity Framework可以毫无问题地读取该密码.
public static string HashPassword(string password)
{
byte[] salt;
byte[] buffer2;
using (var bytes = new Rfc2898DeriveBytes(password, 0x10, 0x3e8))
{
salt = bytes.Salt;
buffer2 = bytes.GetBytes(0x20);
}
byte[] dst = new byte[0x31];
Buffer.BlockCopy(salt, 0, dst, 1, 0x10);
Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20);
return Convert.ToBase64String(dst);
}
Run Code Online (Sandbox Code Playgroud)
SQL中是否有类似的东西我可以在INSERT语句中使用SELECT到另一个表?
我在ASP.NET MVC 5中创建了一个应用程序.现在我需要在服务器上部署应用程序.部署时,我现有的密码是否可以在ASP.NET Identity 2中使用?或者我是否需要使用与客户端计算机相同的机器密钥?
执行时密码是否经过哈希处理?UserManager.CreateAsync(user, model.Password);
。如果是这样,MVC 5 版本 5.2.2.0 项目中的哈希默认情况下是如何完成的?还是SHA1+salt+base64吗?类似的东西?:
internal string EncodePassword(string pass, string salt)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Convert.FromBase64String(salt);
byte[] dst = new byte[src.Length + bytes.Length];
byte[] inArray = null;
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
Run Code Online (Sandbox Code Playgroud)