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

Sécurité Java Discussion :

Encodage et comparaison de mot de passe


Sujet :

Sécurité Java

  1. #1
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut Encodage et comparaison de mot de passe
    J'essaye de comparer 2 mots de passes hashés.

    L'un provient d'un fichier texte encodé en UTF-8, l'autre provient d'une connexion réseau.

    Voici le code :

    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
     
                    String encodedPassword = encodePassword(password);
     
     
                    System.out.println ("login " + login);
                    System.out.println ("log " + log);
                    System.out.println ("comparison " + login.compareTo(log) +  " " + pass.compareTo(encodedPassword));
                    System.out.println ("password " + encodedPassword);
                    System.out.println ("pass " + pass);
     
                    byte[] passBytes = pass.getBytes();
                    String passInHexa = ""; 
                    for(int i=0;i<passBytes.length;i++){ 
                        String s = Integer.toHexString(passBytes[i]); 
                        if(passBytes[i]<0)s = s.substring(s.length()-2); 
                        passInHexa+=s; 
                    }
                    byte[] passwordBytes = password.getBytes();
                    String passwordInHexa = ""; 
                    for(int i=0;i<passwordBytes.length;i++){ 
                        String s = Integer.toHexString(passwordBytes[i]); 
                        if(passwordBytes[i]<0)s = s.substring(s.length()-2); 
                        passwordInHexa+=s; 
                    } 
     
                    System.out.println("bytes message crypté = " + passwordInHexa + " " + passInHexa + " " + pass.equals(password));
    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
     
    public String encodePassword(String passwordToEncode) 
        { 
             java.security.MessageDigest d =null; 
             try 
             { 
                d = java.security.MessageDigest.getInstance("SHA"); 
                d.reset(); 
                d.update(passwordToEncode.getBytes()); 
                //return new String(d.digest(),0,d.digest().length,"UTF-8"); 
                byte[] b = d.digest(); 
                return new String(b,0,b.length,"UTF-8"); 
             } catch (Exception e) 
             { 
             } 
             return passwordToEncode; 
        }
    Et voici la sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    login cedric
    log cedric
    comparison 0 -65470
    password ?65?l???:??X?
    pass ?65?l???:??X?
    bytes message crypté = 416368696c653232 3f6f36353f6c3f3f3f3a1e3f3f17583f false
    A priori, les 2 chaînes pass et password ont l'air identiques. Pourtant le pass.equals(password) renvoie false.
    Quand on décompose les chaînes en question, on s'apperçois qu'elles ne sont pas égale.
    J'ai pourtant utilisé l'UTF-8 tout le long du programme.
    pass vaut 3f6f36353f6c3f3f3f3a1e3f3f17583f tandis que password vaut 416368696c653232.
    D'ou vient cette différence?
    Est-ce qu'il faut que j'encode mon fichier dans un autre format?
    Est-ce que le fait de passer par les sockets java a un effet sur l'encodage?

    Comment comparer 2 chaînes qui auraient un encodage différent?
    Хајде Јано коло да играмо

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    C'est à vérifier mais je pense que le type d'encodage est contenu dans les objets String. Donc quand tu fait un System.out.println(...), la fonction sait comment afficher l'objet correctement donc tu a l'impression de voire la même chaine mais leurs encodage est probablement différents. Et le compareTo s'effectuant charactère par caractère (ie il ne regarde pas l'encodage). La machine utilise le cp1252 par défaut il me semble...

    => pour comparer tes chaines, tu peux :
    • surcharger la méthode compareTo (pe un peu bourrin).
      Te débrouiller pour que les deux chaines se retrouvent avec le meme encodage au moment de la comparaison, ...

  3. #3
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    Je viens de voir que je ne transformais pas le mot de passe encodé mais le mot de passe en clair en hexa.

    Je vais corriger ça pour voir...
    Хајде Јано коло да играмо

  4. #4
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bytes message crypté = 3f6f36353f6c3f3f3f3a1e3f3f17583f 3f6f36353f6c3f3f3f3a1e3f3f17583f false
    En fait, encodedPassword et pass sont bien égaux, même en hexa, cependant, le pass.equals(encodedPassword) renvoie encore false!

    J'ai modifié le code comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    byte[] passwordBytes = encodedPassword.getBytes();
    ...
    System.out.println("bytes message crypté = " + passwordInHexa + " " + passInHexa + " " + pass.equals(encodedPassword));
    Хајде Јано коло да играмо

  5. #5
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    C'est bon, avec la version en hexa, j'arrive à comparer les mots de passe.
    Donc ça me va, je mets un "RESOLU".
    Хајде Јано коло да играмо

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/09/2011, 14h56
  2. comparaison de mot de passe avec la base de données
    Par ayaditch dans le forum NetBeans
    Réponses: 2
    Dernier message: 09/06/2010, 09h56
  3. [SQL] Comparaison de mots de passe
    Par Simpom dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/01/2008, 17h42
  4. [MySQL] Comparaison de mots de passe PHP-MySQL
    Par jaymzwise dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/07/2007, 14h31
  5. [Delphi] Lecture et comparaison de mots de passe
    Par Jayceblaster dans le forum Langage
    Réponses: 6
    Dernier message: 22/04/2006, 12h21

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