[JAVA] Encodage et comparaison de mot de passe

SuperCed

Membre expert
Club iGen
20 Juin 2001
1 353
72
46
superced.rb38.eu
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 :

Bloc de code:
                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));

Bloc de code:
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 :
Bloc de code:
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?
 
C'est bon, j'ai vu mon erreur.
Je comparais le mot de passe encodé avec le mot de passe non encodé venant du fichier.

Par contre, pour que le test soit bon, il faut que je compare les 2 pass grace à leur chaine en hexa.

Le tout est que ça marche...

[RESOLU]