#django #security #facebook #passwords
#django #Безопасность #Facebook #пароли
Вопрос:
Я пишу Facebook canvas webapp, который выполняет вход (используя urllib) на сторонний веб-сайт и выполняет действия от имени пользователя. Это означает, что у меня есть 2 учетные записи; учетная запись, которую пользователь имеет в моем веб-приложении (через facebook), и учетная запись, которую приложение использует для входа в систему от их имени (с данными пользователя / пароля, предоставленными пользователем).
Очевидно, что мне не нужны текстовые пароли в базе данных. Но я также не хочу, чтобы пользователю приходилось вводить свой пароль каждый раз, когда они выполняют действие. Я хочу, чтобы они вводили пароль один раз при регистрации, и я хочу зашифровать пароли, но от чего мне шифровать? Любой ключ на сервере был бы доступен любому, кто получил доступ (т. Е. бесполезен), поэтому я думал зашифровать его по значению, доступному через Facebook API.
Когда пользователь входит в систему (и предоставляет приложению свой токен доступа), приложение может запросить значение через API и зашифровать / расшифровать свой пароль третьей стороны с помощью этого. Любой, у кого есть доступ к серверу, не сможет выполнить этот запрос без входа пользователя в приложение. (Это по-прежнему означает, что кто-то, отслеживающий сервер, может получить пароль третьей стороны для зарегистрированных пользователей, но любой, кто получил одноразовый доступ к базе данных, не мог видеть пароли.) Выдает ли это желаемое за действительное?
Комментарии:
1. Сайт третьей стороны не предоставляет доступ OAuth? Потому что это решает большинство ваших проблем…
2. Нет, API вообще нет, поэтому я должен использовать urllib, по сути, для очистки экрана и выполнения записей входа в систему и т.д.
3. Этот сайт помещает cookie при входе в систему? Вы могли бы использовать этот механизм, чтобы им пришлось входить в систему снова только в следующий раз, когда истечет срок действия cookie?
4. это так, но это все равно потребовало бы от них повторного ввода своего пароля при каждом посещении, чего я хотел бы избежать
5. Честно говоря, не совсем уверен, в чем заключается ваш вопрос. Для работы с сайтом третьей стороны без API или поддержки OAuth, похоже, что ваш план настолько надежен, насколько это возможно. По крайней мере, шифруя с помощью токена Facebook, вы фактически делаете небезопасный компонент входа зависимым от относительно безопасного компонента входа.
Ответ №1:
Вы могли бы также зашифровать его с помощью ключа на сервере. Если кто-либо получит доступ к вашему серверу, у него будет все необходимое для извлечения ключа, даже если вы получаете его из Facebook.
Я думаю, лучшее, что вы можете сделать, это сохранить ключ в месте, недоступном вашему веб-серверу, но доступном вашему скрипту. По крайней мере, убедитесь, что вы не храните ключ в базе данных.
Все, что вы делаете за пределами этого, было бы просто безопасностью через неизвестность. Ключевым моментом здесь является обеспечение безопасности вашего сервера, чтобы никто не получил к нему доступ.
Ответ №2:
Я думаю, вы могли бы хранить логины ТОЛЬКО на клиенте, в каком-нибудь локальном хранилище, и выполнять все действия, связанные с третьей стороной, из клиента в JS.
Это, конечно, потребовало бы некоторых изменений в архитектуре вашего приложения, если бы вы попытались сделать все это со своего сервера, но это было бы возможно наверняка, вы можете событие заставить client JS отправлять данные на ваш сервер после того, как оно сработало, чтобы вы могли регистрировать данные от взаимодействий с третьей стороной.
Кроме того, его преимущество заключается в распределении нагрузки на клиентов
Я знаю, что вы не отметили вопрос с помощью javascript, и вам, похоже, нужно серверное решение, но мне кажется, это лучшее решение. пользователь сохраняет свои данные..
Ответ №3:
Безопасность с помощью obscurity может быть вашим лучшим выбором. Возможно, реализовать алгоритм для генерации ключа, используя что-то стандартное (например, текущую дату и время). Вы можете сохранить дату в своей базе данных и использовать ее для генерации ключа, используя свой собственный алгоритм.