Comment puis-je calculer le hachage SHA-256 D'une chaîne dans Android?

j'essaie d'obtenir le SHA256 d'une chaîne dans Android.

voici le code PHP que je veux faire correspondre:

echo bin2hex(mhash(MHASH_SHA256,"asdf"));
//outputs "f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b"

maintenant, en Java, j'essaie de faire ce qui suit:

            String password="asdf"
            MessageDigest digest=null;
    try {
        digest = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
       digest.reset();
       try {
        Log.i("Eamorr",digest.digest(password.getBytes("UTF-8")).toString());
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

mais cela imprime: "a42yzk3axdv3k4yh98g8 "

Qu'est-ce que j'ai fait de mal ici?


Solution merci à erickson:

 Log.i("Eamorr",bin2hex(getHash("asdf")));

 public byte[] getHash(String password) {
       MessageDigest digest=null;
    try {
        digest = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
       digest.reset();
       return digest.digest(password.getBytes());
 }
static String bin2hex(byte[] data) {
    return String.format("%0" + (data.length*2) + "X", new BigInteger(1, data));
}
41
demandé sur Paŭlo Ebermann 2011-08-23 22:59:05

2 réponses

La fonction PHP bin2hex signifie qu'il prend une chaîne d'octets et l'encode comme un nombre hexadécimal.

dans le code Java, vous essayez de prendre un tas d'octets aléatoires et de les décoder comme une chaîne en utilisant le codage de caractères par défaut de votre plate-forme. Ça ne va pas marcher, et si ça marchait, ça ne produirait pas les mêmes résultats.

Voici une conversion binaire-à-hex rapide et sale pour Java:

static String bin2hex(byte[] data) {
  return String.format("%0" + (data.length * 2) + 'x', new BigInteger(1, data));
}

C'est rapide écrire , pas nécessairement rapide à exécuter. Si vous faites beaucoup de ceux-ci, vous devriez réécrire la fonction avec une implémentation plus rapide.

25
répondu erickson 2011-08-23 19:08:53

vous êtes sur la bonne voie, mais convertir les octets est un peu plus compliqué. Cela fonctionne sur mon appareil:

// utility function
    private static String bytesToHexString(byte[] bytes) {
        // /q/in-java-how-do-i-convert-a-byte-array-to-a-string-of-hex-digits-while-keeping-leading-zeros-39756/"asdf";
    MessageDigest digest=null;
    String hash;
    try {
        digest = MessageDigest.getInstance("SHA-256");
        digest.update(password.getBytes());

        hash = bytesToHexString(digest.digest());

        Log.i("Eamorr", "result is " + hash);
    } catch (NoSuchAlgorithmException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

Source: bytesToHexString la fonction est du projet IOSched .

23
répondu David Snabel-Caunt 2011-08-23 19:10:56