28/08/2010

[.NET] Authentification, MD5 d'un string

Pour raisons évidentes de sécurité, il n'est pas possible de stocker les mots de passe de nos clients en "clair" dans une base de données.

Voilà comment faire pour stocker les mots de passe avec un Hash MD5.



Partons du principe que cette authentification est basé sur pattern n-tiers (DAL, Business, IHM) et que la table et la DAL ont déjà été créé.

Vous commencez par créer votre classe de gestion du Hash dans Business:

using System.Security.Cryptography;

public class MD5CryptGest
{
   public string Get_A_MD5_Hash_from_String (string text)
   {
      //Instanciation d'un d'un service de Hash MD5;
      MD5 svc = new MD5CryptoServiceProvider ();

      //Convertion de la chaîne de caractères en Bytes
      UnicodeEncoding encode = new UnicodeEncoding();
      bytes[] buffer = encode.GetBytes(text);

      //Création du Hash en Bytes puis convertionen String
      bytes[] hash = svc.ComputeHash(buffer);
      string result = Convert.ToBase64String(hash);
      
      return result;

   }
}

Ensuite toujours dans Business, vous créer votre gestion de l'authentification avec un requête Linq (N'oubliez pas de rajouter la référence System.Data.Entity):

using DAL;

public class Authentification
{
   //Constructeur pour instancier ma connexion
   public Authentification()
   {
      connection = new MaBaseEntities();
   }
 
   private MaBaseEntities connection;

   private string authentification(string ID, string password)
   {
      //Requête LinQ
      MD5CryptGest crrypting = new MD5CryptGest();
      MaTable check =  (from user in connection.MaTable
                        where user.userID.equals(ID)
                        select user).FirstOrDefault();
   }

   //Vérification que les informations correspondent
   try
   {
      if (check.userID == ID && check.password == crypting.Get_A_MD5_Hash_from_String(password))
      {
         return "Access granted";
      }

      else
      {
         return "Access denied";
      }

      catch (Exception)
      {
         return "UserID not found";
      }
   }
}

Pour finir on passe dans le code behind de l'IHM :

private void Button_Click(object sender, RoutedEventArgs e)
{
   Authentification AuthEntity = new Authentification ();
   MessageBox.Show(AuthEntity.authentification(textboxID.text, textboxPassword.text));
}

Voilà voilà, c'est fini !

Le code est certainement perfectible alors correction, pistes de réflexion, encouragements, n'hésitez pas à poster vos commentaires.


Aucun commentaire:

Enregistrer un commentaire