2 votes

La comparaison de deux chaînes md5 digérées renvoie un résultat faux.

J'ai deux mots de passe de hachage md5 qui sont identiques et qui devraient retourner vrai en utilisant la méthode MessageDigest.isEqual. Cependant, la comparaison renvoie false.

Lorsque vous utilisez Array.toString pour imprimer les tableaux d'octets, ils sont identiques. Cela ne fonctionne toujours pas, ni pour Arrays.euqals ni pour MessageDigest.isEqual.

public boolean verifyUserCredentials(String username, MessageDigest password) {

        ListIterator<User> iterator = userList.listIterator();
        while (iterator.hasNext()) {
            User user = iterator.next();
            byte md1[] = user.getPassword().digest();
            byte md2[] = password.digest();
            if (user.getUsername() == username && MessageDigest.isEqual(md1, md2)) {
                return true;
            } 
        }
        return false;
    }

5voto

rgettman Points 74908

Vous avez utilisé == mais pour des objets comme String il compare les références d'objets pour voir si elles font référence au même objet.

Pour comparer String les valeurs, utilisez String#equals à la place.

0voto

Chris M. Points 552

Vous pouvez aussi adopter une approche diabolique et abuser des stages de cordes :

user.getUsername().intern() == username.intern()

le code suivant s'imprime :

String s1 = "asdf";
String s2 = "as"; // break this into two parts to keep the compiler from 
s2 = s2 + "df";   // automatically interning the constant and having the strings
                  // be the same. 

System.out.println( s1 == s2 ? "true" : "false");
System.out.println( s1.intern() == s2.intern() ? "true" : "false");

Sortie :

false
true

le +"df" est nécessaire pour empêcher le compilateur d'internaliser automatiquement la chaîne constante.

Remarque : il s'agit davantage d'un jeu d'anecdotes sur Java et d'un abus de langage que de quelque chose que je vous suggérerais de faire réellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X