Вопрос

  1. Может ли кто-нибудь предоставить пример для Java/Android о том, как хешировать пароль, используя PW_HASH_ITERATION_COUNT итерации sha512 + соль?

    в псевдокоде:

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

    Где z = concat(x,y) это объединение x и y.

    Возможно, используя Дайджест сообщения ?

  2. Что бы вы предложили в качестве PW_HASH_ITERATION_COUNT?Сколько итераций будет максимальным, чтобы это могло работать даже на некоторых старых устройствах (2.1+)?

ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ

По уважительным причинам мы будем использовать bcrypt чтобы зашифровать наши пароли.Мы используем jBCrypt выполнение.

В любом случае..чтобы ответить на вопрос...это код для приведенного выше вопроса для использования SHA-512 с 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);
    }
}

С эта библиотека Base64.

Это было полезно?

Решение

Читать мой пост здесь, особенно пост, на который я дал ссылку, о хеширование паролей.

  • В идеале вам следует использовать bcrypt или scrypt, а не выполнять собственное хеширование паролей.
  • Но если вам необходимо, вам следует выполнить как минимум несколько тысяч итераций, а лучше больше.

Да, вы можете использовать MessageDigest для ША-512.Каждый раз, когда ты звонишь digest, состояние объекта автоматически сбрасывается, что очень удобно — вы можете сразу начать обновление для следующей итерации.

Но я все же считаю, что вместо этого вам следует использовать bcrypt или scrypt.Для вашего же блага и блага ваших пользователей.:-)

Другие советы

а HMAC оказывается достаточным для того, что вы хотите сделать, и выполняет только 2 итерации

это сводится к

hash = sha512(concat(xor(salt,nonce2),sha512(concat(xor(salt,nonce1),pw)));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top