2012-02-25 14 views
1

現在、Log inフォームで作業していますが、無効なユーザー名を入力するとこのエラーが発生します。このコード行で LINQ TO SQLのBase-64 char配列の長さが無効

Invalid length for a Base-64 char array. 

:ここ

bool isSame = hasher.CompareStringToHash(txtPassword.Text, hashedPassword); 

は完全なコード

public void verifyAccount() 
     { 
      var hashedPassword = getPassword(); 

      var hasher = new Hasher(); 

      hasher.SaltSize = 16; 
      bool isSame = hasher.CompareStringToHash(txtPassword.Text, hashedPassword); 

      if (isSame==false) 
      { 
       MessageBox.Show("Invalid UserName or Password"); 
      } 
      else 
      { 
       MainWindow main = new MainWindow(); 
       this.Hide(); 
       main.ShowDialog(); 
       this.Close(); 
      } 
     } 

であり、これは自分のパスワードを取得すると同時に、このようなユーザ名を検索するための方法であり、データベースのパスワード。

public string getPassword() 
     { 

      DataClasses1DataContext myDbContext = new DataClasses1DataContext(dbPath); 


      var password = (from user in myDbContext.Accounts 
          where user.accnt_User == txtUser.Text 
          select user.accnt_Pass).FirstOrDefault(); 

      if (password == null) { 
       return "z"; 
      } 

      return password; 
     } 

答えて

1

Base64データは4バイト境界に合わせる必要があります。したがって、例えば "z"はBase64でエンコードされ、次のように埋め込まれます: "eg =="がBase64に準拠している必要があります。実際のハッシュ・パスワードには、同じタイプのパディングを実行する必要があります。

1

hasher.CompareStringToHashはおそらくhashedPasswordがBase64でエンコードされた適切な文字列であると想定しています。この場合、使用する "z"文字列は無効です。

私はこのようにコードを変更することをお勧めしたい:

private void VerifyAccount() 
    { 
     if (!ValidateCredentials(txtUser.Text, txtPassword.Text)) 
     { 
      MessageBox.Show("Invalid user name or password"); 
     } 
    } 

    private bool ValidateCredentials(string userName, string password) 
    { 
     string existingPassword = GetUserPassword(userName); 
     if (existingPassword == null) 
      return false; 

     var hasher = new Hasher { SaltSize = 16 }; 
     bool passwordsMatch = hasher.CompareStringToHash(password, existingPassword); 

     return passwordsMatch; 
    } 

    private string GetUserPassword(string userName) 
    { 
     DataClasses1DataContext dataContext = new DataClasses1DataContext(); 
     var password = (from user in dataContext.Accounts 
         where user.accnt_User == userName 
         select user.accnt_Pass).FirstOrDefault(); 
     return password; 
    } 
+0

ダミーの戻り値が必要です。そのデータベースにUserが存在しない場合は、パスワードが間違っているというメッセージが返されます。 – KyelJmD

+1

私はダミーの値を返さないことをお勧めしますが、代わりにnullを返します。次に、verifyAccount()メソッドで戻り値をnullと比較できます。 nullの場合、ユーザーは存在しません(データベースにNULLを許可しない場合)。 nullでなければ、安全にハッシュをチェックして、パスワードが正しいかどうかを知ることができます。 –

+0

私はそれをどのように実装するでしょうか?私が持っているのは、if文の乱雑なコードに沿ったものです。 – KyelJmD

0

パスワードが見つからない場合は、ちょうどGetPassword()リターンnullをさせてください。次の問題は、しかしhashedPasswordが、それはしようとする前に、if文が終了しますnullされている場合は、

 if (hashedPassword == null || hasher.CompareStringToHash(txtPassword.Text, hashedPassword) 
     { 
      MessageBox.Show("Invalid UserName or Password"); 
     } 

を行うあなたはヌルパスワードを渡す場合CompareStringToHash()が失敗するということですので、代わりの

 bool isSame = hasher.CompareStringToHash(txtPassword.Text, hashedPassword); 

     if (isSame==false) 
     { 
      MessageBox.Show("Invalid UserName or Password"); 
     } 

CompareStringToHash()を実行してください。例外は発生しません。 CompareStringToHash()は、hashedPasswordnullでない場合にのみ実行されます。それで、有効な文字列を格納していれば(Encryptoを作成しているため)、すべてがうまくいくはずです。if文:o)

関連する問題