2010-03-03 3 views
16

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

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 поддержку этого или нет, что было бы безопасной альтернативой?

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

ответ

4

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

5

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

+0

Привет, спасибо за ваш ответ. У меня создалось впечатление, что цель PBKDF2 и его повторное объединение соли и пароля для получения ключа заключалась в том, чтобы сделать процесс вычисления ключа из обычного текстового пароля дорогостоящим и, следовательно, сделать атаки стиля словаря более сложными. Как я уже сказал, спецификация PBKDF2 включает в себя необязательное значение проверки пароля, я просто не знаю, как это получить в реализации Java. – PinkyNoBrain

+0

Я согласен с тем, что возможность быстрой проверки после завершения процесса процесса деривации ключей упрощает атаку грубой силы, так как злоумышленнику не нужно фактически расшифровывать что-либо, чтобы проверить там ключ, но я бы подумал, что большое пространство поиска из 256-битных ключей AES в любом случае, делает атаку чистой грубой силы запрещенной? – PinkyNoBrain

+0

@pinkynobrain: проблема с быстрой проверкой заключается в том, что он значительно сжимает ключевое пространство: у вас есть быстрый способ узнать все фразы, для которых выполняется быстрая проверка. Таким образом, у вас гораздо меньше ключей для перебора AES. –

2

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

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

+0

Привет, спасибо за ваш быстрый ответ и ваш совет по PBES2 и PMAC, я определенно займусь этим. Я думал об использовании подхода с фиксированной строкой, но был обеспокоен тем, что он открыл процесс для известных атак с открытым текстом. Вместо этого я думал об использовании безопасного хэша самого ключа, если хеш-функция действительно не инвертируема, тогда это не предоставило бы никакой информации о самом ключе, но все равно позволит мне проверить, что ключи одинаковы. Что вы считаете, это хороший подход? – PinkyNoBrain

+0

Это правда, что какая-то проверка обязательно делает известный открытый текст. Однако использование функций PB * делает работу более сложной, эффективно умножая ее на счетчик итераций по сравнению с наивным одиночным хэшем. – crazyscot

Смежные вопросы