Frage

  1. Kann jemand ein Beispiel für Java/Android bereitstellen, wie man ein Passwort hasht? PW_HASH_ITERATION_COUNT Iterationen von sha512 + Salz?

    im Pseudocode:

    hash = sha512(concat(pw,salt));
    for (i = 1; i<PW_HASH_ITERATION_COUNT; i++){
        hash = sha512(concat(hash,concat(pw,salt)));
    }
    

    Wo z = concat(x,y) ist die Verkettung von x und y.

    Vielleicht mit MessageDigest ?

  2. Was würden Sie als vorschlagen? PW_HASH_ITERATION_COUNT?Wie viele Iterationen wären das Maximum, damit dies möglicherweise sogar auf einigen älteren Geräten (2.1+) läuft?

UPDATE UPDATE UPDATE

Aus guten Gründen werden wir verwenden bcrypt um unsere Passwörter zu verschlüsseln.Wir benutzen das jBCrypt Implementierung.

Ohnehin..um die Frage zu beantworten...Dies ist der Code für die obige Frage zur Verwendung von SHA-512 mit dem MessageDigest:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import de.seduceme.utils.Base64;

public class PwStorage {
    public static int PW_HASH_ITERATION_COUNT = 5000;
    private static MessageDigest md;

    public static void main(String[] args) {
        String pw = "teüöäßÖst1";
        String salt = "e33ptcbnto8wo8c4o48kwws0g8ksck0";

        try {
            md = MessageDigest.getInstance("SHA-512");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException("No Such Algorithm");
        }

        String result = PwStorage.hashPw(pw, salt);
        System.out.println(result);
        // result: 2SzT+ikuO9FBq7KJWulZy2uZYujLjFkSpcOwlfBhi6VvajJMr6gxuRo5WvilrMlcM/44u2q8Y1smUlidZQrLCQ==
    }


    private static String hashPw(String pw, String salt) {
        byte[] bSalt;
        byte[] bPw;

        try {
            bSalt = salt.getBytes("UTF-8");
            bPw = pw.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("Unsupported Encoding", e);
        }

        byte[] digest = run(bPw, bSalt);
        for (int i = 0; i < PW_HASH_ITERATION_COUNT - 1; i++) {
            digest = run(digest, bSalt);
        }

        return Base64.encodeBytes(digest);
    }

    private static byte[] run(byte[] input, byte[] salt) {
        md.update(input);
        return md.digest(salt);
    }
}

Mit diese Base64-Bibliothek.

War es hilfreich?

Lösung

Lesen mein Post Hier insbesondere der Beitrag, auf den ich verlinkt habe Passwort-Hashing.

  • Idealerweise sollten Sie bcrypt oder scrypt verwenden, anstatt Ihr eigenes Passwort-Hashing durchzuführen.
  • Aber wenn es sein muss, sollten Sie mindestens ein paar tausend Iterationen durchführen, vorzugsweise mehr.

Ja, Sie können es verwenden MessageDigest für SHA-512.Jedes Mal, wenn Sie anrufen digest, wird der Status des Objekts automatisch zurückgesetzt, was sehr praktisch ist – Sie können sofort mit der Aktualisierung für die nächste Iteration beginnen.

Aber ich denke immer noch, dass Sie stattdessen bcrypt oder scrypt verwenden sollten.Zu Ihrem eigenen Wohl und zum Wohl Ihrer Benutzer.:-)

Andere Tipps

Ein HMAC ist für das, was Sie tun möchten, ausreichend und führt nur zwei Iterationen aus

es läuft auf hinaus

hash = sha512(concat(xor(salt,nonce2),sha512(concat(xor(salt,nonce1),pw)));

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top