[Résolu][Java]Problème de cryptage/décryptage

Voilà, j’enregistre les login et les passwords des utilisateurs dans un fichier. Bien sûr le but est de crypter le mot de passe. Mais il y a quelque part une erreur qui fait qu’au décryptage les mots de passes de correspondent plus… Et il s’agit que d’un seul caractère qui diffère lorsque j’affiche en String les deux tableaux de bytes des deux mots de passes comparés. Voici donc le bout de mes codes:

[codebox]public void setPassword(String login, String motDePasse, int droit){
[ … ]
pass = readFixedLengthByte(PASS_SIZE, file);
file.close();
[ … ]
MessageDigest messageDigest = MessageDigest.getInstance(“MD5”);
byte[] mdpBytes = motDePasse.getBytes();
messageDigest.reset();
messageDigest.update(mdpBytes);
writeFixedLengthByte(messageDigest.digest(mdpBytes), PASS_SIZE, file);
[ … ]
}[/codebox]

[codebox]public void verifyPassword(String login, String motDePasse) throws LoginEchoueException{
[ … ]
messageDigest = MessageDigest.getInstance(“MD5”);
byte[] mdp = motDePasse.getBytes();
messageDigest.reset();
messageDigest.update(mdp);
mdp = messageDigest.digest(mdp);
mdp = fixLengthByte(mdp, PASS_SIZE);
System.out.println(new String(mdp));
System.out.println(new String(pass));
if(!MessageDigest.isEqual(mdp, pass)) throw new LoginEchoueException();
[ … ]
}[/codebox]

Et les deux println (qui sont là juste pour vérifier le truc) me donnent un truc du style:
[codebox]t¸s7EB ÔÓ?€Äf=Åå
t¸s7EB ÔÓ?¬Äf=Åå[/codebox]
Je ne sais pas si on peut vraiment comparer des données cryptées mais voilà…

La méthode “writeFixedLengthByte” écrit dans le fichier le tableau de byte en complétant par des blancs (puisque j’utilise un RandomAccessFile).
La méthode “ReadFixedLengthByte” le lit de la même façon.
La méthode “fixLengthByte” renvoie simplement le tableau de byte complété par des blancs (afin de pouvoir comparer).
Voici ces méthodes:

[codebox]private byte[] readFixedLengthByte(int size, DataInput in)throws IOException{
byte[] bytes = new byte;
for(int i=0; i<size; i++){
bytes[i] = in.readByte();
}
return bytes;
}

private byte[] fixLengthByte(byte[] tab, int size){
byte[] bytes = new byte;
int i;
for(i=0; i<tab.length; i++){
bytes[i] = tab[i];
}
for(; i<bytes.length; i++){
bytes[i] = ’ ';
}
return bytes;
}

private void writeFixedLengthByte(byte[] tab, int size, DataOutput out)throws IOException{
out.writeBytes(new String(fixLengthByte(tab, size)));
}[/codebox]
Voilà, et il n’y a apparement aucune erreurs du coté de l’écriture du fichier.
Je ne suis pas non plus très sûr d’avoir totalement compris les méthodes digest, reset et update de la classe MessageDigest…

Merci d’avance à celui ou celle qui m’aidera. B)

Ca ressemble à un problème d’encoding. J’ai déjà rencontré le même problème : j’écrivais en UTF-8 et je lisais en ISO-8859-1.

Ca y ressemble beaucoup. En effet, les caractères accentués ne sont pas altérés et je crois (je ne suis pas 100% sûr) qu’ils ont le même code en UTF-8 et en ISO. Alors que le signe € ne passe pas car il n’a pas le même code.

Comment récupères-tu ‘pass’ dans ton code ? Essai peut-être plutôt ce constructeur String(byte[] bytes, String charsetName) si tu construit tes String à partir de tableau de byte. Idem à la lecture du fichier, vaut mieux préciser l’encoding.

En espérant t’aider.

En y re-regardant, essai ça out.writeBytes(new String(fixLengthByte(tab, size), “UTF-8”)) dans ta méthode writeFixedLengthByte(…)

[edit]Correction de l’emplacement d’une parenthèse fermante[/edit]

Au passage, et dans l’hypothese ou ca marche, il est ou le “sel” pour le hash dans tes fonctions?

Ok, ça marche, juste que j’ai dut ecrire en iso et que dans ton exemple c’est une parenthèse trop loin…
Bref, un tout grand merci! B)

N’y a-t-il pas une méthode de hashing par défaut dans les classes plus hautes? J’ai pas besoin d’un truc élaboré non plus B)

Non mais faut toujours rajouter un sel a tout truc dont tu fais un hash, sinon c’est le mal B) Meme un sel tout con ca fait l’affaire. Au strict minimum concatener le login au mdp avant de faire le hash par exemple, de garantir l’unicite. Enfin un truc quoi B)

Il a raison pour le sel : mettre ton sel à toi c’est plus sûr, le pseudo-aléatoire est moins predictible et le cryptage moins facilement cassable.

Désolé, pour la parenthèse (édité et corrigé). Je crois qu’il faut que tu mettes un [Résolu] pour faire plaisir à tout le monde B) .