I've used this method to get salted password. I don't know how I can compare the stored salted password with user entered password when he/she logs in
string salt = GetRandomSalt();
string passwordHash = HashPassword(txtPassword.Text, salt);
IdentityResult result = manager.Create(user, passwordHash);
public String GetRandomSalt(Int32 size = 12)
{
var random = new RNGCryptoServiceProvider();
var salt = new Byte[size];
random.GetBytes(salt);
return Convert.ToBase64String(salt);
}
public String HashPassword(String password, String salt)
{
var combinedPassword = String.Concat(password, salt);
var sha256 = new SHA256Managed();
var bytes = UTF8Encoding.UTF8.GetBytes(combinedPassword);
var hash = sha256.ComputeHash(bytes);
return Convert.ToBase64String(hash);
}
My application is ASP.net MVC 4 and uses identity framework to provide roles and users
I tried using the following code in login form, but it's not working. I guess it's because the manager.Create hashes the salted hash again. How to fix it?
Login.aspx
bool pwmatch = VerifyPassword(txtUserName.Text, txtPassword.Text);
public String HashPassword(String password, String salt)
{
var combinedPassword = String.Concat(password, salt);
var sha256 = new SHA256Managed();
var bytes = UTF8Encoding.UTF8.GetBytes(combinedPassword);
var hash = sha256.ComputeHash(bytes);
return Convert.ToBase64String(hash);
}
private bool VerifyPassword(string suppliedUserName, string suppliedPassword)
{
var userStore = new UserStore<IdentityUser>();
userStore.Context.Database.Connection.ConnectionString =
ConfigurationManager.ConnectionStrings["MUSICConnectionString"].ConnectionString;
var manager = new UserManager<IdentityUser>(userStore);
var user = manager.FindByName(suppliedUserName);
bool passwordMatch = false;
string dbPasswordHash = user.PasswordHash;
int saltSize = 12;
string salt =dbPasswordHash.Substring(dbPasswordHash.Length - saltSize);
string hashedPasswordAndSalt =HashPassword(suppliedPassword, salt);
// Now verify them.
passwordMatch = hashedPasswordAndSalt.Equals(dbPasswordHash);
return passwordMatch;
}