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));Et voici la sortie :
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; }
A priori, les 2 chaînes pass et password ont l'air identiques. Pourtant le pass.equals(password) renvoie false.
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
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?
Partager