Как я должен хранить пароли локально для многопользовательского приложения? - PullRequest
4 голосов
/ 08 мая 2011

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

procedure SavePass(Password: WideString);
var
  Pass: TIniFile;
begin
  Pass := TIniFile.Create(ChangeFileExt(Application.ExeName, '.PASS'));
  Pass.WriteString('Users', 'USERNAME', Password);
  Pass.Free;

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

Ответы [ 6 ]

9 голосов
/ 08 мая 2011

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

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

Если вы хотите зашифровать хранилище, чтобы люди не могли прочитать файл, вы можете использовать Windows.EncryptFile() и Windows.DecryptFile(). В более новых Delphi это аккуратно обернуто в IoUtils.TFile.Encrypt() и IoUtils.TFile.Decrypt.

Если вы действительно хотите, чтобы другие не читали текст вашего пароля в открытом виде, вам придется использовать какое-то шифрование с ключом. Где вы храните этот ключ тогда? Это в первую очередь уничтожило бы цель сохранения пароля. Лучше запретить доступ другим пользователям, например, используя пользовательские привилегии к файловой системе, потому что все, что вы или ваше программное обеспечение можете сделать, может сделать «хакер», если у него те же привилегии.

2 голосов
/ 08 мая 2011

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

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

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

2 голосов
/ 08 мая 2011

Вы должны хранить хешированные пароли. Например, вы можете использовать один из алгоритмов SHA из Delphi Cryptography Package . При проверке паролей хэшируйте пароль, который пользователь вводит, и сравнивайте его с паролем, сохраненным в файле.

Рассматривали ли вы использование безопасности Windows вместо того, чтобы пытаться свернуть свою собственную?


Кроме того, вы можете столкнуться с проблемами записи в каталог вашей программы, если ваша программа находится в каталоге файлов программы и используется UAC.

1 голос
/ 08 мая 2011
  • Пока вы можете, не храните пароль, но хэшируйте его правильно (используйте соль, повторяйте хэш n раз и т. Д.), Потому что атаки радужной таблицы осуществимы и хорошо работают против плохо выбранных паролей и слишкомпростое хеширование.
  • Если возможно, воспользуйтесь «встроенной безопасностью».Используйте проверку подлинности Windows , чтобы избежать хранения паролей.
  • Если вам действительно нужно сохранить мастер-пароль или подобное, используйте API-интерфейсы Windows, такие как CryptProtectData , чтобы защитить их локально.
1 голос
/ 08 мая 2011

В имеются блоки хеша и шифрования * Lockbox . Вы должны хешировать пароль, соединенный со случайной «солью», и хранить соль и хеш вместе. Чтобы людям было сложнее взломать хэш - пробовать все вероятные пароли до тех пор, пока не будет найден правильный - вы должны повторить хэш. Когда пользователь впоследствии вводит свой пароль для входа в систему, берите соль из вашего магазина и хешируйте ее с введенным паролем, итерируйте и проверяйте результат на соответствие сохраненному хешу. Если они одинаковые, они дали правильный пароль.

0 голосов
/ 08 мая 2011

Я думаю, что лучше всего сохранять пользовательские настройки в реестре под HKEY_CURRENT_USER.Это будет держать их настройки все вместе и отдельно от настроек других пользователей.

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

Вот статья о том, как вы можете писать и читать из реестра .

...