web-dev-qa-db-fra.com

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 associer:

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 ceci affiche: "a42yzk3axdv3k4yh98g8"

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


Solution grâce à 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));
}
44
Eamorr

La fonction PHP bin2hex signifie qu’elle prend une chaîne d’octets et la code sous forme de nombre hexadécimal.

Dans le code Java, vous essayez de prendre un tas d'octets aléatoires et de les décoder en tant que chaîne en utilisant le codage de caractères par défaut de votre plate-forme. Cela ne fonctionnera pas et si cela se produisait, les résultats ne seraient pas les mêmes.

Voici une conversion rapide et compliquée de Java à hexadécimal:

static String bin2hex(byte[] data) {
    StringBuilder hex = new StringBuilder(data.length * 2);
    for (byte b : data)
        hex.append(String.format("%02x", b & 0xFF));
    return hex.toString();
}

Ceci est rapide pour write , pas nécessairement rapide à exécuter. Si vous en faites beaucoup, vous devriez réécrire la fonction avec une implémentation plus rapide.

27
erickson

Vous êtes sur la bonne voie, mais la conversion des octets est un peu plus compliquée. Cela fonctionne sur mon appareil:

// utility function
    private static String bytesToHexString(byte[] bytes) {
        // http://stackoverflow.com/questions/332079
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(0xFF & bytes[i]);
            if (hex.length() == 1) {
                sb.append('0');
            }
            sb.append(hex);
        }
        return sb.toString();
    }

// generate a hash

    String password="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: la fonction bytesToHexString provient du projet IOSched .

24
David Snabel-Caunt