我已经使用这种方法来获取加盐密码。我不知道如何将存储的加盐密码与用户登录时输入的密码进行比较
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);
}
我的应用程序是 ASP.net MVC 4 并使用身份框架来提供角色和用户
我尝试在登录表单中使用以下代码,但它不起作用。我想这是因为 manager.Create 再次对加盐哈希进行哈希处理。如何解决?
登录.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;
}