98 votes

Le hachage MD5 dans Android

J'ai une simple android client qui a besoin de "parler" à un simple C# port d'écoute HTTP. Je veux fournir un niveau de base de l'authentification en passant par nom d'utilisateur/mot de passe dans les requêtes POST.

Le hachage MD5 est trivial en C# et fournit assez de sécurité pour mes besoins, mais je n'arrive pas à trouver comment faire cela à de l'android à la fin.

EDIT: Juste pour répondre aux préoccupations soulevées au sujet de MD5 de la faiblesse - le C# server s'exécute sur le Pc des utilisateurs de mon client android. Dans de nombreux cas, ils seront de l'accès au serveur à l'aide de wi-fi sur leur propre Lan mais, à leurs risques et périls, ils peuvent choisir d'accéder à partir d'internet. Aussi le service sur le serveur doit utiliser pass-through " pour le MD5 d'une application 3ème partie je n'ai aucun contrôle dessus.

242voto

Den Delimarsky Points 12342

Ici est une application que vous pouvez utiliser (mis à jour pour utiliser plus jusqu'à ce jour les conventions Java - for:each boucle, StringBuilder au lieu de StringBuffer):

public static final String md5(final String s) {
    final String MD5 = "MD5";
    try {
        // Create MD5 Hash
        MessageDigest digest = java.security.MessageDigest
                .getInstance(MD5);
        digest.update(s.getBytes());
        byte messageDigest[] = digest.digest();

        // Create Hex String
        StringBuilder hexString = new StringBuilder();
        for (byte aMessageDigest : messageDigest) {
            String h = Integer.toHexString(0xFF & aMessageDigest);
            while (h.length() < 2)
                h = "0" + h;
            hexString.append(h);
        }
        return hexString.toString();

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}

Bien qu'il n'est pas recommandé pour les systèmes qui impliquent la même le niveau de sécurité de base (MD5 est considéré comme rompu et peut être facilement exploité), il est parfois suffisant pour des tâches de base.

55voto

Andranik Points 113

L'on a accepté la réponse n'a pas fonctionné pour moi sous Android 2.2. Je ne sais pas pourquoi, mais c'était le fait de "manger" certains de mes zéros (0) . Apache commons également ne fonctionne pas sur Android 2.2, parce qu'il utilise des méthodes qui sont pris en charge qu'à partir de Android 2.3.x. Aussi, si vous voulez juste MD5 d'une chaîne, Apache commons est trop complexe pour cela. Pourquoi on devrait garder un ensemble de bibliothèque à utiliser juste une petite fonction d'elle...

Finalement, j'ai trouvé l'extrait de code suivant ici qui a fonctionné parfaitement pour moi. J'espère que ce sera utile pour quelqu'un...

public String MD5(String md5) {
   try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(md5.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
          sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
       }
        return sb.toString();
    } catch (java.security.NoSuchAlgorithmException e) {
    }
    return null;
}

29voto

Christian Points 101

L'androidsnippets.com le code ne fonctionne pas de manière fiable car les 0 semblent être coupé de l'résultant de hachage. Une meilleure mise en œuvre est ici.

22voto

tbraun Points 773

Si vous utilisez Apache commons est une option, alors ce serait une meilleure mise en œuvre:

String md5Hex = new String(Hex.encodeHex(DigestUtils.md5(data)));

Ou sha

String shaHex= new String(Hex.encodeHex(DigestUtils.sha("textToHash")));

Source: http://stackoverflow.com/a/9284092/1390015

L'affichage de ce ici pour gagner du temps pour les personnes qui sont à la recherche d'une solution plus simple, suivez le lien et upvote sa solution d'attribuer la bonne personne.

12voto

wzbozon Points 2851

Une solution ci-dessus en utilisant DigestUtils ne fonctionne pas pour moi. Dans ma version de Apache commons (la dernière en 2013), il n'y a pas une telle classe.

J'ai trouvé une autre solution ici dans un blog. Il fonctionne parfaitement et n'a pas besoin d'Apache commons. Il semble un peu plus court que le code a accepté la réponse ci-dessus.

public static String getMd5Hash(String input) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] messageDigest = md.digest(input.getBytes());
        BigInteger number = new BigInteger(1, messageDigest);
        String md5 = number.toString(16);

        while (md5.length() < 32)
            md5 = "0" + md5;

        return md5;
    } catch (NoSuchAlgorithmException e) {
        Log.e("MD5", e.getLocalizedMessage());
        return null;
    }
}

Vous aurez besoin de ces importations:

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

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