2009-02-25 7 views
2

Je fais un test de hachage et de mots de passe de sel. Eh bien, je peux ajouter un mot de passe de hachage et de sel à la base de données, mais je suis resté coincé pour stocker les mots de passe de la base de données. j'ai une base de données simple:Essayer de stocker le mot de passe à la base de données

       Table 
           _______ 

           ProvaHS 
           -------- 
          (PK) LoginID int 
           UserName nvarchar(50) 
           Password nvarchar(50) 
           Salt  nvarchar(50) 

donc créer un formulaire pour ajouter nouvel enregistrement à la base de données avec ce code:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    #region SALT 
    public static class PasswordCrypto 
    { 
     private static SHA1CryptoServiceProvider Hasher = new SHA1CryptoServiceProvider(); 
     //Private Hasher As New MD5CryptoServiceProvider() 

     static internal string GetSalt(int saltSize) 
     { 
      byte[] buffer = new byte[saltSize + 1]; 
      RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
      rng.GetBytes(buffer); 
      return Convert.ToBase64String(buffer); 
     } 

     static internal string HashEncryptString(string s) 
     { 
      byte[] clearBytes = Encoding.UTF8.GetBytes(s); 
      byte[] hashedBytes = Hasher.ComputeHash(clearBytes); 
      return Convert.ToBase64String(hashedBytes); 
     } 

     static internal string HashEncryptStringWithSalt(string s, string salt) 
     { 
      return HashEncryptString(salt + s); 
     } 
    } 
    #endregion 

    private void GetSalt() 
    { 
     this.textBoxSalt.Text = PasswordCrypto.GetSalt(16); 
    } 

     private void GetSaltHash() 
     { 
      // It's how i salt and hash the password before to save it to the Database 
      this.textBoxPassword.Text = PasswordCrypto.HashEncryptStringWithSalt(this.textBoxClear.Text, this.textBoxSalt.Text); 
     } 

    private void GetHash() 
    { 
     //Demo purposes -- this is an unsalted hash 
     this.textBoxClear.Text = PasswordCrypto.HashEncryptString(this.textBoxPassword.Text); 
    } 

    private void Add(object sender, RoutedEventArgs e) 
    { 
     DataClasses1DataContext dc = new DataClasses1DataContext(); 

     try 
     { 
      if (textBoxUserName.Text.Length > 0) 
      { 
       ProvaH tab = new ProvaH(); 
       tab.UserName = textBoxUserName.Text; 
       tab.Password = textBoxPassword.Text; 
       tab.Salt = textBoxSalt.Text; 
       dc.ProvaHs.InsertOnSubmit(tab); 
       dc.SubmitChanges(); 

      } 
     } 
     catch (Exception ex) 
     { 

      MessageBox.Show("Error!!!"); 
     } 

    } 

    private void HashButton(object sender, RoutedEventArgs e) 
    { 
     GetHash(); 
    } 

    private void SaltButton(object sender, RoutedEventArgs e) 
    { 
     GetSalt(); 
    } 

    private void HashSaltButton(object sender, RoutedEventArgs e) 
    { 
     GetSaltHash(); 
    } 

    private void Close_W(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 

} 

}

  • avec cette méthode je peux sel , hash et enregistrer le mot de passe à la base de données .. (en suivant les conseils du membre de StackOverflow) merci ..

Maintenant je teste comment le mot de passe du magasin de la base de données et ici j'ai eu un mal à ...

public partial class Login : Window 
{ 
    public Login() 
    { 
     InitializeComponent(); 
    } 
    #region SALT 
    public static class PasswordCrypto 
    { 
     private static SHA1CryptoServiceProvider Hasher = new SHA1CryptoServiceProvider(); 
     //Private Hasher As New MD5CryptoServiceProvider() 

     static internal string GetSalt(int saltSize) 
     { 
      byte[] buffer = new byte[saltSize + 1]; 
      RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
      rng.GetBytes(buffer); 
      return Convert.ToBase64String(buffer); 
     } 

     static internal string HashEncryptString(string s) 
     { 
      byte[] clearBytes = Encoding.UTF8.GetBytes(s); 
      byte[] hashedBytes = Hasher.ComputeHash(clearBytes); 
      return Convert.ToBase64String(hashedBytes); 
     } 

     static internal string HashEncryptStringWithSalt(string s, string salt) 
     { 
      return HashEncryptString(salt + s); 
     } 
    } 
    #endregion 

    private void closs(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 


     public bool ValidateApplicationUser(string userName, string password) 
     { 

     bool OK = false; 
      DataClasses1DataContext dc = new DataClasses1DataContext(); 

      object saltValue = from c in dc.ProvaHs where c.UserName == userName select c.Salt; 
      if (!(saltValue == System.DBNull.Value)) 
      { 
       password = PasswordCrypto.HashEncryptStringWithSalt(passwordTextBox.Password, saltValue.ToString()); 

      } 
      var query = from c in dc.ProvaHs where c.UserName == userName && c.Password == password select new { c.LoginID, c.UserName, c.Password }; 
      if (query.Count() != 0) 
      { 
       return true; 
      } 
     return false; 
     } 

    private void Confirm(object sender, RoutedEventArgs e) 
    { 
      bool authenticated = true; 

     if (usernameTextBox.Text != "" && passwordTextBox.Password.ToString() != "") 
      { 
       authenticated = ValidateApplicationUser(usernameTextBox.Text, passwordTextBox.Password.ToString()); 
      } 
      if (!authenticated) 
      { 
       MessageBox.Show("Invalid login. Try again."); 
      } 
      else 
      { 
       MessageBox.Show("Aaaaahhhh.JOB DONE!!!!...."); 
      } 
    } 
} 

quand je déboguer l'application que je reçois toujours une erreur sur cette ligne de code: si (query.Count()! = 0) dans "query" = Empty: "L'énumération n'a donné aucun résultat" Avez-vous des suggestions pour résoudre cette erreur et stocker le mot de passe de la base de données dans mon cas? Merci

Répondre

2

Essayez:

public bool ValidateApplicationUser(string userName, string password) 
{ 
    DataClasses1DataContext dc = new DataClasses1DataContext(); 

    var saltValue = dc.ProvaHs.Where(c => c.UserName == userName) 
          .Select(c => c.Salt) 
          .SingleOrDefault(); 

    if (saltValue == null) return false; 

    password = PasswordCrypto.HashEncryptStringWithSalt(passwordTextBox.Password, saltValue.ToString()); 

    return dc.ProvaHs.Any(c => c.UserName == userName && c.Password == password); 
} 
+0

Merci beaucoup Mehrdad c'est vrai que je peux voir le message "Job done !!!" :) Passez un bon jour. câlin chaud – JayJay

1

(pas strictement répondre à votre question, mais je vais l'ajouter de toute façon)

Vous ne voulez pas juste encode hex (non base64) la sortie?

public static string SHA256Hash(string Data) 
{ 
    SHA256 sha = new SHA256Managed(); 
    byte[] hash = sha.ComputeHash(Encoding.ASCII.GetBytes(Data)); 

    StringBuilder stringBuilder = new StringBuilder(); 
    foreach(byte b in hash) 
    { 
     stringBuilder.AppendFormat("{0:x2}", b); 
    } 
    return stringBuilder.ToString(); 
} 

(C'est SHA-2, juste pour échanger SHA256 SHA1 et SHA256Managed avec SHA1Managed).

Other snippet implementations here

2

Ne pas utiliser SHA1. Utilisez SHA256, sel aléatoire réel, et lots (c.-à-d. 8000) d'itérations SHA256. Parce que SHA est conçu pour la vitesse, mais cela signifie que l'attaque par dictionnaire est rapide. Il y a aussi de meilleurs moyens, comme l'algorithme de scrypt. Ou protocole SRP.

+0

Salut M. Witold, Merci pour votre conseil en fait je vais utiliser SHA256. Bienvenue !!! – JayJay

Questions connexes