Использование MD5 для генерации ключа шифрования из пароля?

Я пишу простую программу для шифрования файлов. Главным образом как учебное упражнение, но, возможно, для будущего серьезного использования. Все тяжелые работы выполняются с помощью сторонних библиотек, но безопасное соединение компонентов все еще остается проблемой для не криптографа. По сути, у меня почти все работает так, как я думаю.

Я использую 128-битный AES для шифрования с длиной ключа 128 бит. Я хочу, чтобы пользователи могли вводить пароли переменной длины, поэтому я решил хешировать пароль с помощью MD5, а затем использовать хеш в качестве ключа. Я подумал, что это приемлемо - ключ всегда должен быть секретным, поэтому нет причин беспокоиться о столкновениях.

Теперь, когда я реализовал это, я наткнулся на пару статей, указывающих, что это плохая идея. Мой вопрос: почему? Если выбран надежный пароль, шифр должен быть достаточно надежным, чтобы никогда не раскрывать ключ, за исключением чрезвычайных (читай: в настоящее время неосуществимых) попыток перебора, верно? Должен ли я использовать что-то вроде PBKDF2 для генерации ключа или это просто избыточно для всех, кроме самых экстремальных криптографических приложений?

3 ответа

Решение

Эта статья об усилении ключей может вам помочь. По сути, вы хотите сделать ключ более сильным (более энтропийным, чем в пароле) и сделать его вывод из пароля надежным и трудоемким.

Ну, поскольку ваш пост носит общий характер, позвольте мне сказать несколько общих вещей:

  1. MD5, SHA-0, SHA-1 - это битые хэши, и вы не должны использовать их для каких-либо криптографических целей, используйте SHA-2.

  2. Как правило, вы должны использовать хорошо известные и документированные подходы к извлечению ключей из паролей (вы не упоминаете, какой язык, скажите, пожалуйста, какой вы используете).

  3. При любом программировании безопасности самое важное, прежде чем что-то делать, строго документировать свою "модель угрозы". Это в основном список всех атак, которые вы пытаетесь предотвратить, и как вы будете это делать, а также того, какие атаки вы не можете предотвратить. Это довольно весело, и вы узнаете обо всех атаках и других интересных вещах.

Ответ на ваш новый вопрос: вы определенно должны использовать что-то вроде PBKDF2 для генерации ключа.

Я предполагаю, что у вас будет пароль (по крайней мере, 10 символов верхнего нижнего числа и пунктуация справа?), Который затем сгенерирует ключ AES-256. Ключ будет использоваться для шифрования / дешифрования файла (ов). Вы хотите использовать что-то вроде PBKDF2, чтобы уменьшить вероятность того, что кто-то, кто получит ваш файл, сможет определить ваш ключ / пароль с помощью атак методом перебора. Использование чего-то вроде PBKDF2 (и случайной соли!) Увеличивает стоимость взлома шифрования файла.

Что я действительно рекомендую, так это то, что вы используете это как игрушку, а не для защиты того, что вас действительно волнует. Если вы не эксперт по безопасности, вы будете делать ошибки, даже эксперты (и многие из них вместе) делают ошибки: http://www.sslshopper.com/article-ssl-and-tls-renegotiation-vulnerability-discovered.html

Другие вопросы по тегам