Crypto.VerifyHashedPassword抛出异常

时间:2015-05-08 11:10:10

标签: c# asp.net asp.net-mvc asp.net-mvc-4 cryptography

我使用Crypto.HashPassword('nakedPassword');对用户密码进行了哈希处理,并将此值保存在我的数据库中。

注册期间:

public Status Signup(Customer user) 
{
    //change password to password hash & create a verification codetry 
    try 
    {
        int pkid;
        user.PASSWORD = Crypto.HashPassword(user.PASSWORD);
        user.VER_CODE = Guid.NewGuid().ToString();
        Mapper.CreateMap <Customer,user>();
        var mappedcustomer = Mapper.Map<Customer,user>(user);
        string result = _userRepository.Signup(mappedcustomer);
        Status status = new Status();
        if (result == "MOB_EXISTS") 
        {
            status.setError("Mobile number already exists");
        } 
        else if (result == "EMAIL_EXISTS") 
        {
            status.setError("Email already exists");
        }
    } catch (Exception e) {}
}

稍后我在登录时使用:

进行检索
Status status = new Status();
try
{
    string hashedPass = _userRepository.GetHashedPassByEmail(email);
    if (Crypto.VerifyHashedPassword(hashedPass, password)) //<-- THIS LINE THROWS THE EXCEPTION
    {
        //authenticated
        status.setSuccess("Login successful !");
    }
    else
    {
        status.setError("Invalid Credentials. Please try again.");
    }

}
catch (Exception e)
{
    status.setError("Error during login. Please check the credentials and try again.");
}

指向的行抛出异常

  

System.FormatException

     

Base-64字符数组或字符串的长度无效。

     

堆栈跟踪:

     

在System.Convert.FromBase64_Decode(Char * startInputPtr,Int32   inputLength,Byte * startDestPtr,Int32 destLength)at   System.Convert.FromBase64CharPtr(Char * inputPtr,Int32 inputLength)
  在System.Convert.FromBase64String(String s)at   System.Web.Helpers.Crypto.VerifyHashedPassword(String hashedPassword,   字符串密码)在Tmmmt.Business.UserProvider.login(String email,   字符串密码)   C:\ Users \用户的MacBook \源\回购\ tmmmt.com \ Tmmmt.Business \ UserProvider.cs:线   802

注意:这不会一直发生,但仅在某些注册时发生。 请参阅 Crypto.VerifyHashedPassword

修改

当我查看我的代码注册时,我看到生成了一个哈希,但在写入db时会被截断。

例如......

实际哈希: ANFRzzPtJ6H / hmsxmbPpkUgIDcmxoaWDV6Ej8Xes8 + PupKnsKq3EI / cUTHCRZm9t +克==​​

Db中的哈希: ANFRzzPtJ6H / hmsxmbPpkUgIDcmxoaWDV6Ej8Xes8 + PupKnsKq

数据库中的密码字段为varchar(8000),我将通过以下方式进行...

public virtual ObjectResult<string> sp_signupweb(string name, string email, string passHash, string code, Nullable<long> mob, Nullable<int> utc, string verifycode, ObjectParameter result) 

{

    ...//some code//

     var passHashParameter = passHash != null ?
                    new ObjectParameter("passHash", passHash) :
                    new ObjectParameter("passHash", typeof(string));

    //.... some more code
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<string>("sp_signupweb", nameParameter, emailParameter, passHashParameter, codeParameter, mobParameter, utcParameter, verifycodeParameter, result);

}

有人可以解释截断并帮我解决。

1 个答案:

答案 0 :(得分:0)

修复存储过程(注册)的参数长度为我修复了它。有关详细信息,请查看有关OP的评论