SHA512散列凭证在验证时失败

时间:2017-06-20 23:11:01

标签: c# wpf sql-server-ce

我收到了这个注册表,我收到了用户的电子邮件和密码,并使用SHA512哈希密码

 public Boolean IsRegistered(String email, String pass)
    {
        SHA512 shaM = new SHA512Managed();
        if (pass.Length > 0 && email.Length > 0)
        {
            byte[] data = Encoding.UTF8.GetBytes(pass);
            String encryptedpass = Encoding.UTF8.GetString(shaM.ComputeHash(data));
            using (ModelContainer db = new ModelContainer())
            {
                //User usr = db.UserSet.Where(u => u.PasswordDigest == encryptedpass && u.Email == email).First();

                  int matches = (from u in bd.UserSet
                                 where u.PasswordDigest == encryptedpass&& u.Email == email
                                 select new
                                 {
                                     Id = u.Id
                                 }
                             ).Count();
                if (matches > 0)
                {
                    return true;
                }
            }
        }
        return false;
    }

每次用户登录时都使用此方法,它就像魅力(我猜), 事情是,当我提示用户更改他/她的密码我似乎无法验证旧的这里是我尝试

我执行以下操作来检索MyAccount表单构造函数

上的用户数据
    User user;.

    public MyAccount()
    {
        InitializeComponent();

        try
        {
            using (ModelContainer db = new ModelContainer())
            {
                user = (from u in db.UserSet where u.Id == 2 select u).First();

                txtName.Text = user.Name;
                txtEmail.Text = user.Email;
            }
        }
        catch (Exception x)
        {
            ErrorAlert error = new ErrorAlert("Error: " + x.Message);
            error.Owner = getParentWindow();
            error.ShowDialog();
        }
    }

然后我在表单button_click

上验证它
using (ModelContainer db = new ModelContainer())
            {
                SHA512 shaM = new SHA512Managed();
                string oldpass = Encoding.UTF8.GetString(shaM.ComputeHash(Encoding.UTF8.GetBytes(ptxtOldPassword.Password)));
                shaM.Dispose();

                db.UserSet.Attach(user);

                Regex rgx = new Regex(@"\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z");

                if (rgx.IsMatch(txtEmail.Text))
                {
                    if (oldpass == user.PasswordDigest)
                    {
                        if (ptxtNewPassword.Password.Equals(ptxtNewPassword2.Password))
                        {
                            string newpass = Encoding.UTF8.GetString(shaM.ComputeHash(Encoding.UTF8.GetBytes(ptxtNewPassword.Password)));
                            user.Name = txtName.Text;
                            user.Email = txtEmail.Text;
                            user.PasswordDigest = newpass;

                            db.SaveChanges();
                        }
                        else
                        {
                            ErrorAlert error = new ErrorAlert("Passwords do not match");
                            error.Owner = getParentWindow();
                            error.ShowDialog();
                        }

当我将数据库中的旧密码与用户输入的密码匹配时,它们不匹配,因为它们是字符串我尝试使用等于没有运气我认为==会工作但是我错了,我看着其他回答并发现这个Sha512 not returning equal in c# hash validation遗憾的是它对我不起作用,我需要理解为什么我的第一次验证工作和第二次验证不起作用 所以任何帮助都是合法的Have a nice day

1 个答案:

答案 0 :(得分:0)

您不需要比较最终字符串,在字节级别进行测试。 Check this之前的问题。

此外,如果您已经验证了用户的存在(通过电子邮件或任何其他机制),为什么不使用新密码更改/更新?您可以使用电子邮件进行验证,并重新使用登录/登录的工作功能。