Как проверить пароль перед расшифровкой данных - PullRequest
2 голосов
/ 11 января 2009

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

Теперь я хочу проверить, что пользователь ввел правильный пароль, прежде чем выполнять расшифровку. Эта проверка должна быть быстрой, а процесс расшифровки - нет.

Как я могу проверить пароль до фактического завершения процесса расшифровки? Я думал о том, чтобы сохранить хэш пароля в качестве первых нескольких байтов зашифрованного файла - это было бы легко и быстро - но я не уверен, подрывает ли он безопасность?

Я использую .NET и встроенные классы криптографии.

Ответы [ 2 ]

7 голосов
/ 11 января 2009

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

Есть ли возможность вводить контрольные суммы в данные через равные промежутки времени? Или, если поток представляет записи, вы можете прочитать его с помощью итератора (IEnumerable<T> и т. Д.), Чтобы он читался лениво и рано прерывался?

( edit ) Также - принудительно дешифрует нетривиальный кусок данных (но не весь поток), прежде чем он сможет сказать, был ли пароль верным, должно быть достаточно, чтобы его было трудно переборить -force. Если он должен работать только с первыми 128 байтами (или чем-то еще), это может быть достаточно быстрым, чтобы его можно было попробовать (словарь и т. Д.). Но при регулярном использовании (одна попытка, правильный или неправильный пароль) это не должно влиять на производительность.

1 голос
/ 11 января 2009

Я полагаю, вы используете пароль в качестве соли для процесса шифрования / дешифрования. Простейшим подходом было бы зашифровать некоторую стандартную фразу или пароль, который пользователь предоставил в качестве входной строки с тем же паролем, что и соль для процесса шифрования. Когда пользователь хочет расшифровать данные, примите этот пароль как соль для вашего процесса расшифровки и используйте ot для расшифровки зашифрованного пароля. Если вы вернете пароль, тогда пользователь предоставил правильный пароль, и вы можете продолжить процесс расшифровки, в противном случае уведомите пользователя, что его пароль неверный.

Процесс будет:

  • Пользователь дал ПАРОЛЬ и ДАННЫЕ для шифрования.
  • Вы шифруете ПАРОЛЬ с помощью ПАРОЛЯ в качестве соли. и сохраните его как ENCRYPTED_PASSWORD.
  • Зашифруйте ДАННЫЕ с помощью ПАРОЛЯ и сохраните их.

Пользователь возвращается, дает вам ПАРОЛЬ.

  • Вы расшифровываете ENCRYPTED_PASSWORD с помощью PASSWORD в виде соли.
  • Если результат равен ПАРОЛЮ, вы расшифруете ДАННЫЕ, в противном случае вы уведомите пользователя.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...