пример Android sha512
-
29-10-2019 - |
Вопрос
Может ли кто-нибудь предоставить пример для 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.Возможно, используя Дайджест сообщения ?
Что бы вы предложили в качестве
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);
}
}
Решение
Читать мой пост здесь, особенно пост, на который я дал ссылку, о хеширование паролей.
- В идеале вам следует использовать bcrypt или scrypt, а не выполнять собственное хеширование паролей.
- Но если вам необходимо, вам следует выполнить как минимум несколько тысяч итераций, а лучше больше.
Да, вы можете использовать MessageDigest
для ША-512.Каждый раз, когда ты звонишь digest
, состояние объекта автоматически сбрасывается, что очень удобно — вы можете сразу начать обновление для следующей итерации.
Но я все же считаю, что вместо этого вам следует использовать bcrypt или scrypt.Для вашего же блага и блага ваших пользователей.:-)
Другие советы
а HMAC оказывается достаточным для того, что вы хотите сделать, и выполняет только 2 итерации
это сводится к
hash = sha512(concat(xor(salt,nonce2),sha512(concat(xor(salt,nonce1),pw)));