пример Android Sha512 - PullRequest
       17

пример Android Sha512

2 голосов
/ 18 июня 2011
  1. Может ли кто-нибудь предоставить пример для java / android о том, как хешировать пароль, используя PW_HASH_ITERATION_COUNT итерации sha512 + salt?

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

    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.

    Может быть, использовать MessageDigest ?

  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 lib .

Ответы [ 2 ]

4 голосов
/ 18 июня 2011

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

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

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

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

0 голосов
/ 18 июня 2011

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

сводится к

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