Проверка пароля с помощью PBKDF2 в Java

Я делаю шифрование файлов на основе паролей в Java; Я использую AES в качестве основного алгоритма шифрования и PBKDF2WithHmacSHA1 для получения ключа из комбинации соли и пароля с использованием следующего кода (который я получил от другого щедрого плаката на этом сайте).

SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec ks = new PBEKeySpec(password,salt,1024,128);
SecretKey s = f.generateSecret(ks);
Key k = new SecretKeySpec(s.getEncoded(),"AES");

Я разделяю соль, пользователь вводит свой пароль на каждом конце, и шифрование и дешифрование работают нормально:-) Моя проблема в том, что я хотел бы проверить, правильно ли введен пароль, прежде чем приступать к ( потенциально долго) процесс дешифрования. Я знаю, что спецификация PBKD включает необязательное значение проверки в 2 байта, но я не уверен, как сгенерировать это значение, используя описанный выше подход. Поддерживает ли Java поддержку этого или нет, что было бы безопасной альтернативой?

Спасибо за ваше время.

Ответ 1

Эй, спасибо сумасшедшему шотландцу и Крису за помощь. После некоторого рытья я решил использовать методы, описанные на странице страницу шифрования файлов Dr Gladmans для выполнения как проверки пароля, так и аутентификации сообщения. Я считаю, что этот метод, основанный на PBKDF2 и MAC, делает получение значения verfication для пароля достаточно дорогостоящим, чтобы обеспечить его безопасность. Еще раз спасибо, и я надеюсь, что это решение поможет другим.

Ответ 2

Механизм быстрой проверки не защищен, по определению. Весь смысл использования PBKDF2 или связанных с ним методов заключается в медленной проверке пароля, для предотвращения программ взлома паролей. Если вы добавите систему быстрой проверки, взломщики паролей смогут очень быстро угадать пароли навалом.

Ответ 3

Вычислите какой-то тег проверки пароля и сохраните его вместе с зашифрованными файловыми данными, чтобы вы могли сначала его проверить. Это может быть что-то вроде PBMAC фиксированной (короткой) строки. Конечно, это должна быть необратимая функция, чтобы взломщик не мог определить пароль, и не слишком быстро вычислить, чтобы смещать атаку грубой силы.

Считаете ли вы, что (и как) вы обнаружите, был ли весь файл дешифрован правильно? Вероятно, вам следует рассмотреть некоторые комбинации PBES2 и PBMAC, а не напрямую использовать AES.