Как сохранить пароль в C # .NET? - PullRequest
4 голосов
/ 03 июля 2011

Я делаю приложение на C # .NET, в котором я создал учетную запись администратора.Теперь для входа в эту учетную запись администратор должен ввести пароль.

Мой вопрос: как мне сохранить этот пароль?

Возможные варианты:

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

  2. Отношение к базе данных (возможно, но только для скалярного отношения ....)

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

Есть ли другой оптимальный способ хранения пароля?

Ответы [ 5 ]

8 голосов
/ 03 июля 2011

Вы можете сохранить его с солью и хэшированием в файле настроек пользователя.

Вы можете получить доступ к файлу настроек по умолчанию, используя что-то вроде:

private bool CheckPassword(string salt, string password) 
{
   var hash = Encoding.ASCII.GetBytes(salt + password);
   var sha1 = new SHA1CryptoServiceProvider();
   var sha1hash = sha1.ComputeHash(hash);
   var hashedPassword = ASCIIEncoding.GetString(sha1hash);

   return (Properties.Settings.Default.adminPass == hashedPassword);
}
5 голосов
/ 03 июля 2011

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

3 голосов
/ 03 июля 2011

Предполагается, что для сохранения учетных данных пользователя на сервере: сохраните хэш пароля в базе данных.В идеале вы должны вычислить и сохранить что-то вроде SALT + sha1(SALT + password), где SALT - это некоторая случайная строка, вычисленная для каждого сохраненного пароля.

3 голосов
/ 03 июля 2011

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

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

1 голос
/ 03 июля 2011

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

Это потому, что строки могут оставаться в памяти в течение неизвестного неконтролируемого отрезка времени.

Они должны храниться с использованием SecureString .

В порядке объяснения:

Экземпляр класса System.String является неизменным и, если он больше не нужен, не может быть программно запланирован для сборки мусора; то есть экземпляр только для чтения после его создания, и невозможно предсказать, когда экземпляр будет удален из памяти компьютера. Следовательно, если объект String содержит конфиденциальную информацию, такую ​​как пароль, номер кредитной карты или личные данные, существует риск, что эта информация может быть раскрыта после ее использования, поскольку ваше приложение не может удалить данные из памяти компьютера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...