Клиентский Вход в систему - как сохранить учетные данные надежно на стороне клиента?

(Как Jon Skeet, большая часть этого принимает.NET)

Рискуя тем, чтобы казаться спорным, комментирует как они, просто беспокоят меня:

Обучение записать многопоточные программы правильно является чрезвычайно трудным и трудоемким.

Потоков нужно избежать, если это возможно...

практически невозможно записать программное обеспечение, которое делает что-либо значительное, не усиливая потоки в некоторой способности. Если Вы находитесь в Windows, открываете свой Диспетчер задач, включаете столбец Thread Count, и можно, вероятно, считать с одной стороны количество процессов, которые используют единственный поток. Да, не нужно просто использовать потоки ради использования потоков, и при этом оно не должно быть сделано высокомерно, но откровенно говоря, я полагаю, что эти клише используются слишком часто.

, Если бы я должен был изложить многопоточное программирование кратко для истинного новичка, я сказал бы это:

  • Перед вскакиванием в него, сначала поймите, что граница класса не является тем же как границей потока. Например, если метод обратного вызова для Вашего класса называет другой поток (например, делегат AsyncCallback в TcpListener. BeginAcceptTcpClient () метод), поймите, что обратный вызов выполняется на что другой поток. Таким образом даже при том, что обратный вызов происходит на том же объекте, все еще необходимо синхронизировать доступ к членам объекта в методе обратного вызова. Потоки и классы являются ортогональными; важно понять эту точку.
  • Определяют, какие данные должны быть совместно использованы потоками. Как только Вы определили совместно используемые данные, попытайтесь консолидировать его в единый класс, если это возможно.
  • Предел места, где совместно используемые данные могут быть записаны и считаны. Если можно свалить это к одному месту для записи и одному месту для чтения, Вы будете делать себе огромное одолжение. Это не всегда возможно, но это - хорошая цель стрелять для.
  • , Очевидно, удостоверяются, что Вы синхронизируете доступ к совместно используемым данным с помощью класса Монитора или ключевого слова блокировки.
  • , Если возможно, используйте отдельный объект для синхронизации совместно используемых данных независимо от сколько различных общих полей, там. Это упростит вещи. Однако это может также чрезмерно ограничить вещи также, в этом случае, Вам, возможно, понадобится объект синхронизации для каждого общего поля. И в этой точке, использование неизменных классов становится очень удобным.
  • , Если у Вас есть один поток, который должен сигнализировать о другом потоке (потоках), я настоятельно рекомендовал бы использовать класс ManualResetEvent, чтобы сделать это вместо того, чтобы использовать события/делегатов.

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

РЕДАКТИРОВАНИЕ: нет ничего "чрезвычайно трудного" о ThreadPool. QueueUserWorkItem (), асинхронные делегаты, различные пары метода BeginXXX/EndXXX, и т.д. в C#. В любом случае эти методы делают очень легче выполнить различные задачи потоковым способом. Если у Вас есть приложение GUI, которое делает любую тяжелую базу данных, сокет или взаимодействие ввода-вывода, практически невозможно сделать фронтенд быстро реагирующим пользователю, не усиливая потоки негласно. Методы, которые я упомянул выше, делают это возможным и являются бризом для использования. Важно понять ловушки, быть уверенным. Я просто полагаю, что мы делаем программистов, особенно младшие, плохая услуга, когда мы говорим о том, как "чрезвычайно трудное" многопоточное программирование или как потоков "нужно избежать". Комментарии как они упрощают проблему и преувеличивают миф, когда истина - то, что поточная обработка никогда не была легче. Существуют законные причины использовать потоки, и клише как это просто кажутся контрпродуктивными мне.

17
задан DVK 1 October 2009 в 12:59
поделиться

3 ответа

I recommend one of three approaches:

  • Avoid storing the password at all by using authentication tokens. In this model, the user logs in one time, and the server generates a unique, large, sparse token that the client can store and use as its login "password." The server only accepts this token from one client at a time, so if two clients try to use it simultaneously, the token is invalidated. The token is also generally invalidated after a period of time (1 week, 2 weeks, a year, whatever is appropriate). When the token is invalidated, the user must log in again by hand and the process is repeated. This is basically the approach of Gmail and similar web site logins.

  • If you must store the password, I recommend relying on the OS to manage it for you. Windows and Mac both have good secure storage systems (DPAPI and Keychain respectively). Linux doesn't have a good always-available solution, though, so it depends on your market. The advantage of using the OS is that the OS can provide protections you can't easily provide yourself, and the user can centrally manage the overall protection of the OS storage (using smartcards, etc.) to a level you are unlikely to reproduce. The OS secure stores are also typically quite convenient for the user.

  • If neither of these are options, then store an encrypted file with a master password that the user must enter every time they launch your app. This is how Firefox works (or at least it did last time I looked, which has been a while). This is reasonably secure, but much less convenient for the user (and low convenience often means low adoption by the users, or poor use through simpler passwords, etc). I would investigate the Firefox code as an example of how to implement this.

16
ответ дан 30 November 2019 в 14:06
поделиться

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

1
ответ дан 30 November 2019 в 14:06
поделиться

KeePass provides even an API to use for developers.

0
ответ дан 30 November 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: