Пишу программу для шифрования. Возник вопрос - как генерировать ключ из текстового пароля, введенного пользователем. Наиболее распространенным является PBKDF2. Хеши паролей хранить не планируется, программа будет просто брать введенный пароль, генерировать на его основе ключ и им шифровать/дешифровать. Собственно, вопрос: нужно ли использовать вообще PBKDF2 или подобное решение с солью (при том, что хеш не хранится, то и соль будет отсутствовать). Как вообще это делают нормальные криптографы?
Если я буду хранить вместе с файлом длинный случайный пароль в зашифрованном виде, то шифрование этого пароля должно производиться ключом который ввел пользователь или функцией типа PBKDF2 от ключа который ввел пользователь.
E(K)(PlainText) + E(k)(K) или E(K)(PlainText) + E(PBKDF2(k))(K)
K - случайный 256 битный ключ;
k - ключ пользователя;
Шифрование.
Генерируется длинный ключ шифрования под текущий алгоритм.
Длинным ключом шифруются данные.
Этот ключ шифруется паролем и сохраняется вместе с данными.
Расшифровка.
Сохраненный зашифрованный ключ расшифровывается введенным паролем.
Тем что получилось расшифровываются данные.
Сверяется контрольная сумма для проверки правильно распаковалось или нет (подошел пароль или нет).
А ключ пользователя (которым шифруется сгенерированный случайный ключ для шифрования файла), не должен ли он проходить через что-то подобное PBKDF2 для затруднения возможности вычисления ключа шифрования путем перебора ключа пользователя?
Можно немного затруднить подбор, проводя много раундов шифрования (миллион, например) ключа паролем. Чтобы один пароль проверялся, допусти, полсекунды.
На основе КОРОТКОГО пароля, если ты ничего не хранишь дополнительного в профиле пользователя, НЕВОЗМОЖНО сгенерировать стойкий серьезный ключ длинной больше чем на 1 сессию.