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 :
Et voici la sortie :
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?
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?