it-swarm.com.de

Wie kann ich den SHA-256-Hash einer Zeichenfolge in Android berechnen?

Ich versuche den SHA256 eines Strings in Android zu bekommen.

Hier ist der PHP Code, dem ich entsprechen möchte:

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

In Java versuche ich nun Folgendes zu tun:

            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();
    }

Aber das druckt aus: "a42yzk3axdv3k4yh98g8"

Was habe ich hier falsch gemacht?


Lösung dank 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

Die PHP -Funktion bin2hex bedeutet, dass sie eine Bytekette nimmt und diese als Hexadezimalzahl codiert.

Im Java-Code versuchen Sie, eine Reihe von zufälligen Bytes zu verwenden und sie als Zeichenfolge zu dekodieren, indem Sie die Standardzeichencodierung Ihrer Plattform verwenden. Das wird nicht funktionieren, und wenn dies der Fall wäre, würden nicht die gleichen Ergebnisse erzielt.

Hier ist eine schnelle Bin-to-Hex-Konvertierung für Java:

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();
}

Dies ist schnell zu write und nicht unbedingt schnell auszuführen. Wenn Sie viele davon ausführen, sollten Sie die Funktion mit einer schnelleren Implementierung umschreiben.

27
erickson

Sie befinden sich auf der rechten Seite, aber die Umwandlung der Bytes ist etwas komplizierter. Das funktioniert auf meinem Gerät:

// 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();
    }

Quelle: bytesToHexString-Funktion stammt aus dem IOSched -Projekt.

24

Komplette Antwort mit Anwendungsbeispiel, danke an erickson.

Fügen Sie dies in Ihre Klasse "Utils" ein.

public static String getSha256Hash(String password) {
    try {
        MessageDigest digest = null;
        try {
            digest = MessageDigest.getInstance("SHA-256");
        } catch (NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        }
        digest.reset();
        return bin2hex(digest.digest(password.getBytes()));
    } catch (Exception ignored) {
        return null;
    }
}

private 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();
}

Anwendungsbeispiel:

Toast.makeText(this, Utils.getSha256Hash("123456_MY_PASSWORD"), Toast.LENGTH_SHORT).show();
1
Henrique Monte

ich weiß, dass dies beantwortet wurde, aber ich fand eine Hashing-Bibliothek unter Android-Arsenal und es ist sehr einfach, einfach und nur eine Codezeile. kann MD5, SHA-1, SHA-256, SHA-384 oder SHA-512 hacken.

  1. füge dies zuerst deinem gradle hinzu und synchronisiere es

    implementation 'com.github.1AboveAll:Hasher:1.2'

  2. fangen Sie an zu haben

    Hasher.Companion.hash("Hello",HashType.SHA_1);

0
Ayodele Kayode