Я пишу небольшое настольное приложение, которое должно быть в состоянии зашифровать файл данных и защитить его паролем (т.е. нужно ввести правильный пароль для дешифрования). Я хочу, чтобы зашифрованный файл данных был автономным и переносимым, поэтому аутентификация должна быть встроена в файл (или так я предполагаю).
У меня есть стратегия, которая кажется работоспособной и кажется логичной на основе того, что я знаю (чего, вероятно, достаточно, чтобы быть опасным), но я понятия не имею, действительно ли это хороший дизайн или нет. Так скажи мне: это безумие? Есть ли лучший/лучший способ сделать это?
- Шаг 1: Пользователь вводит текстовый пароль, например. "MyDifficultPassword"
- Шаг 2: Приложение хэширует пароль пользователя и использует это значение в качестве симметричного ключа для шифрования/дешифрования файла данных. например "MyDifficultPassword" → "HashedUserPwdAndKey".
- Шаг 3: Приложение хэширует хешированное значение с шага 2 и сохраняет новое значение в заголовке файла данных (т.е. незашифрованную часть файла данных) и использует это значение для проверки пароля пользователя. например "HashedUserPwdAndKey" → "HashedValueForAuthentication"
В основном я экстраполирую общий способ внедрения паролей веб-сайта (когда вы не используете OpenID, то есть), который заключается в том, чтобы хранить (соленый) хэш пароля пользователя в вашей базе данных и никогда не сохранять фактический пароль. Но поскольку я использую хэшированный пароль пользователя для симметричного ключа шифрования, я не могу использовать одно и то же значение для аутентификации. Поэтому я снова его использую, в основном рассматривая его точно так же, как и другой пароль, и сохраняю двукратно хешированное значение в файле данных. Таким образом, я могу взять файл на другой компьютер и расшифровать его, просто введя свой пароль.
Итак, этот дизайн разумно безопасен или безнадежно наивен или где-то посередине? Спасибо!
РЕДАКТ: уточнение и последующий вопрос: соль.
Я думал, что соль должна храниться в секрете, чтобы быть полезной, но ваши ответы и ссылки подразумевают, что это не так. Например, эта спецификация, связанная с erickson (ниже), говорит:
Таким образом, определение пароля на основе пароля, как определено здесь, является функцией пароля, соли и счетчика итераций, где последние две величины не должны храниться в секрете.
Означает ли это, что я могу сохранить значение соли в том же месте/файле, что и хешированный ключ, и все же быть более безопасным, чем если бы я вообще не использовал соль во время хэширования? Как это работает?
Немного больше контекста: зашифрованный файл не предназначен для совместного использования или дешифрования другими, это действительно однопользовательские данные. Но я хотел бы развернуть его в общей среде на компьютерах, которые я не полностью контролирую (например, на работе), и иметь возможность переносить/перемещать данные, просто копируя файл (чтобы я мог использовать его дома, на разных рабочие станции и т.д.).