IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Comment convertir une valeur hachée en sh256 en string et la rendre lisible ? [Débutant]


Sujet :

ASP.NET

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2016
    Messages : 14
    Par défaut Comment convertir une valeur hachée en sh256 en string et la rendre lisible ?
    Bien le bonjour,

    Je me permet de poster ce post car j'ai un petit souci.

    En effet je cherche pour une de mes applications à stocker dans deux variables de type string et privée la valeur hachée d'un login et d'un mot de passe.

    Voici mes variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private string loginString = "", passwordString = "";
    C'est dans ces variables que je souhait stocker les hash.

    Pour ce faire, j'ai donc fait une méthode temporaire qui est appelée au chargement de la page:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    protected void Unnamed_Click()
        {
            byte[] HashValPass, HashValLogin;
            string HashValPassString, HashValLoginString,
            LoginString = "log";
            passwordString = "pass";
     
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] LoginBytes = UE.GetBytes(LoginString);
            byte[] PassBytes = UE.GetBytes(passwordString);
     
            SHA256Managed SHhash = new SHA256Managed();
            HashValLogin = SHhash.ComputeHash(LoginBytes);
            HashValPass = SHhash.ComputeHash(PassBytes);
     
            HashValLoginString = Convert.ToBase64String(HashValLogin);
            HashValPassString = Convert.ToBase64String(HashValPass);
            //HashValLoginString = System.Text.Encoding.UTF8.GetString(HashValLogin);
            //HashValPassString = System.Text.Encoding.UTF8.GetString(HashValPass);
     
     
            Response.Write(HashValLoginString);
            Response.Write("<br />");
            Response.Write(HashValPassString);
        }
    Cependant j'obtient vraiment quelque chose d’illisible pour l'homme et inexploitable car les valeur je souhaite les copier/coller...

    Merci d'avance pour votre aide ...

    PS: J'ai également essayé avec:

  2. #2
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    SHA renvoie un tableau de bytes qui ne correspondent pas nécessairement à des valeurs valides d'un charset, il est donc normal d'obtenir une "chaîne" toute moche.
    Par contre quel est le souci avec l'utilisation de l'encodage en base 64 ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2016
    Messages : 14
    Par défaut RE:
    En faite dans ma méthode d’authentification je vais vérifier les valeurs entrées par le client avec celles ci et si c'est pareil je le login sinon je retourne une erreur...

    Voici ma méthode de hachage des données du client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    private static string Hash(string pass, string login)
            {
                byte[] HashValPass, HashValLogin;
                string HashValPassString, HashValLoginString, LoginString = login, PassString = pass;
     
                UnicodeEncoding UE = new UnicodeEncoding();
                byte[] LoginBytes = UE.GetBytes(LoginString);
                byte[] PassBytes = UE.GetBytes(PassString);
     
                SHA256Managed SHhash = new SHA256Managed();
                HashValLogin = SHhash.ComputeHash(LoginBytes);
                HashValPass = SHhash.ComputeHash(PassBytes);
     
                HashValLoginString = Convert.ToBase64String(HashValLogin);
                HashValPassString = Convert.ToBase64String(HashValPass);
     
                //HashValPassString = System.Text.Encoding.UTF8.GetString(HashValPass);
                //HashValLoginString = System.Text.Encoding.UTF8.GetString(HashValLogin);
     
                return HashValPassString + HashValLoginString; //on retourne la valeur hachée du login et du mdp entrés par le client
            }
    et ma méthode pour l'authentification:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     protected void validerLogin_Click(object sender, EventArgs e) //methode de connexion à l'application
            {
     
                string login = Request.Form["login"].ToString();
                string pass = Request.Form["password"].ToString();
     
                if (Hash(login, pass) != passwordString + loginString) //login et ou password incorrect
                {
                    lbl_erreur.Text = "erreur: login et/ou mot de passe incorrect(s)";
                }
                else
                {
                    MVPage.ActiveViewIndex = 1; //Passage à la vue principale
                    tbParamsSites_Load(); //chargement des données sur la page (tableau)
                }
            }
    Et comme d'autres personnes auront accès au code je ne veux pas qu'ils voient le login et le mot de passe en clair ...
    D'où le fait que je veuille stocker juste la valeur hachée...

    Mais quand je copie colle la valeur retournée dans ma variable et que je fait la vérification quoi que je fasse on ne peux plus se logger ...

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Il n'est pas possible de retrouver la chaine d'origine à partir d'un hash, à moins de tester toutes les combinaisons possibles en mode brute force

    Pour retrouver la chaine d'origine, il ne faut pas utiliser un hash mais la cryptographie, qui permet de crypter/décrypter.

    L'intérêt du hash pour de l'authentification c'est d'avoir le process suivant :
    1 - L'utilisateur tape son mot de passe puis le POST vers le serveur (idéalement en SSL pour éviter de faire passer le mot de passe en clair)
    2 - Sur le serveur, tu crées un hash à partir du mot de passe en clair
    3 - Tu récupères le hash correspondant au login dans ta base de données (bien sûr, on ne stocke sous aucun prétexte un mot de passe en clair). Si le hash est salé (salted), c'est encore mieux.
    4 - Si les 2 hash correspondent, alors c'est le bon mot de passe. S'ils ne correspondent pas, l'utilisateur s'est trompé.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2016
    Messages : 14
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Il n'est pas possible de retrouver la chaine d'origine à partir d'un hash, à moins de tester toutes les combinaisons possibles en mode brute force

    Pour retrouver la chaine d'origine, il ne faut pas utiliser un hash mais la cryptographie, qui permet de crypter/décrypter.

    L'intérêt du hash pour de l'authentification c'est d'avoir le process suivant :
    1 - L'utilisateur tape son mot de passe puis le POST vers le serveur (idéalement en SSL pour éviter de faire passer le mot de passe en clair)
    2 - Sur le serveur, tu crées un hash à partir du mot de passe en clair
    3 - Tu récupères le hash correspondant au login dans ta base de données (bien sûr, on ne stocke sous aucun prétexte un mot de passe en clair). Si le hash est salé (salted), c'est encore mieux.
    4 - Si les 2 hash correspondent, alors c'est le bon mot de passe. S'ils ne correspondent pas, l'utilisateur s'est trompé.
    Quand je passe comme ça cela fonctionne

    Sauf que la c'est pour un intranet ou très très peux de personnes utiliseront la page donc nous ne voulons rien stocker en BDD ...

    C'est mon cahier des charges qui veux cela ... donc je m'y tien ^^
    D'où le fait que je fasse une méthode temporaire que je supprimerai après qui contient le login et le mot de passe en clair le hash et le retourne.
    Je récupère ensuite le hash du login et du mot de passe pour les copier coller dans les bonnes variables.

    Je fait donc la vérification depuis ces variables qui contiennent le hash du login et du pass de la page ^^

    Donc dans tous les cas je compare les deux hash. Et seul moi connais le mot de passe ^^

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Ok soit, pour une appli intranet je recommanderai plutôt d'utiliser l'authentification Windows (basée sur les comptes Windows de l'Active Directory), mais bon si ton cahier des charges veut ca alors on va essayer de t'aider

    Donc déjà tu peux utiliser la fonction Hash :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private string Hash(string input)
    {
    	var sha256 = new SHA256Managed();
    	var bytes = Encoding.Default.GetBytes(input);
     
    	return Convert.ToBase64String(sha256.ComputeHash(bytes));
    }
    Ensuite voici un exemple de logique :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // Le login saisi par l'utilisateur
    var userLogin = "lelogindefou";
     
    // Le password saisi par l'utilisateur
    var userPassword = "lepassdefou";
     
    // Le hash du login de la page que seul toi connait (en clair, c'est lelogindefou)
    var theLoginHash = "RUo0/O85RpnoU7ngQFiFC/3Cq4UnHcImzBC3D72rr0Y=";
     
    // Le hash du password de la page que seul toi connait (en clair, c'est lepassdefou)
    var thePasswordHash = "ukaz2KtV4y8lz8PhZ1/WcAQVsycTBfgHuv+w6baFzuo=";
     
    // On concatene le hash du login et le hash du password saisis par l'utilisateur
    var userInputHash = Hash(userLogin) + Hash(userPassword);
     
    // On concatene le hash du login de la page, et le hash du password de la page
    var comparisonHash = theLoginHash + thePasswordHash;
     
    // On compare les 2 chaines concatenees
    if (!userInputHash.Equals(comparisonHash, StringComparison.InvariantCultureIgnoreCase))
    {
    	// Elles ne sont pas égales, l'authentification échoue
    }
    else
    {
    	// L'authentification a réussi
    }
    Est-ce que ca résou ton souci ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2016
    Messages : 14
    Par défaut RE:
    Merci beaucoup ça marche bien

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment convertir une valeur char* en hexa
    Par zendel dans le forum C
    Réponses: 11
    Dernier message: 04/11/2015, 16h43
  2. Comment accéder à une valeur d'une hach
    Par youssef1983 dans le forum Langage
    Réponses: 3
    Dernier message: 01/07/2010, 13h56
  3. Réponses: 3
    Dernier message: 28/09/2006, 17h18
  4. Réponses: 3
    Dernier message: 28/09/2003, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo