2013-12-13 2 views
1

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

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

У меня нет большого опыта в шифровании и расшифровке, но я могу использовать методы, как предлагалось here, что делает их private.

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

Но я хочу знать, безопасно ли хранить зашифрованный пароль в памяти?

+1

Это не так, сборщик мусора хранит копии в памяти, которые находятся вне досягаемости. И вы не можете «вычеркивать» строки, они неизменяемы. Причина для класса SecureString. –

+0

Вместо этого используйте 1-полосный хэш - SHA1/SHA256. – Kami

+0

Я боюсь, что вам не хватает фона (даже больше, чем я), чтобы сделать это правильно.Пара примечаний: «private» не делает ничего, чтобы удержать хакера (особенно, если они могут проверять память по своему усмотрению), и даже если это может скрыть процедуру шифрования, это будет безопасность через скрытность, «гашение временных переменных», вероятно, не делает на что вы надеетесь (подразумевая, что вы имеете в виду что-то вроде 'string s = plaintext; ...; s = null;'), и если вы держите ключ доступным, вы только минимально блокируете атакующего. Пожалуйста, скажите мне, если что-то неправильно истолковал. – delnan

ответ

1

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

Хранение пароля в памяти разумно. В любом случае, он должен быть в памяти.

+0

, но я беспокоюсь, так как сохранит его в памяти все время, есть ли другой стандартный подход? – Mahesha999

+0

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

+0

@Oleksi. Выстрел в программах - это законная, а иногда и чрезвычайно эффективная атака. Единственным недостатком является то, что он требует физического доступа к компьютеру или запускает произвольный код (в нужное время и с достаточными привилегиями для защиты от защиты памяти). Сведение к минимуму критически важных данных в физической памяти сводит к минимуму окно атаки, хотя оно, очевидно, не закрывает его. – delnan

1

Просто, чтобы убедиться, что я правильно понимаю ваш вопрос:

  1. Вы пишете клиентское программное обеспечение
  2. Пользователь вводит пароль
  3. Вы хранить пароль в переменной в течение короткого промежутка времени, чтобы аутентифицировать к веб-службе
  4. Вы хотите узнать, можете ли вы сохранить пароль в памяти (то есть в переменной) в течение более длительных периодов времени, чтобы снова подтвердить подлинность веб-службы

Если эти предположения верны: Не беспокойтесь об этом слишком много, просто держать его в переменной, и это он - предпочтительно в SecureString как предложено Hans Passant. SecureString будет делать работу за вас:

значение объекта SecureString автоматически шифруется, может быть изменен, пока ваше приложение не помечает его как только для чтения, и может быть удален из памяти компьютера либо приложение или Сборщик мусора .NET Framework.

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

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

Смежные вопросы