Хранение паролей для внешних API - лучшая практика

Если я создал приложение, которое получило доступ к некоторым данным, скажем, из Gmail, Twitter и Facebook, и я бы хотел, чтобы пользователь мог вводить свои данные аутентификации только один раз, а через несколько дней или недель он сбрасывается, что является лучшим способ сделать это, динамически, в Ruby?

Я вижу, что многие люди просто имеют конфигурационный файл с учетными данными своих клиентов / пользователей, например:


gmail_account:
    username: myClient
    password: myClientsPassword

Это выглядит а) как будто это очень небезопасно и б) это не сработало бы, если бы я хотел хранить такую ​​информацию для тысяч пользователей. Каков рекомендуемый способ сделать это?

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

5 ответов

Решение

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

Но зачем это вообще? Facebook Connect, Twitter и Google, использующие OAuth, не требуют хранения пользовательских паролей. В какой-то момент срок действия файлов cookie пользователя истечет (или они попытаются получить доступ к вашему сайту с другого компьютера), и им придется пройти повторную аутентификацию. Вы не можете предотвратить повторную аутентификацию - вместо этого вы должны сделать так, чтобы конечный пользователь мог как можно проще справиться с ней.

Такие сервисы предоставляют авторизацию OpenAuth. Вам настоятельно рекомендуется взглянуть на это.

Безопасность

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

  • Хранить в некотором кодированном виде, например. Base64, это защищает вас от знания пароля при просмотре базы данных вашими глазами, но не защищает вас от чего-либо еще.
  • Убедитесь, что файлы не читаются другим пользователем
  • Зашифруйте ваш жесткий диск, чтобы никто не смог получить пароли от кражи вашего жесткого диска. Ваш компьютер потребует ввода пароля при загрузке.

хранения

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

  • Один файл для каждого пользователя, поэтому файловая система, а не ruby, должна искать данные
  • Сделать много подкаталогов. Производительность некоторых файловых систем снижается, если вы помещаете много файлов в один каталог. например. поместите файл 'abcd' в 'a/b/c/d'

Вы можете использовать базу данных вместо файловой системы

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

Я настоятельно рекомендую вам использовать OAuth, но если вам нужно хранить пароли (пожалуйста, будьте абсолютно уверены, что вам это нужно), вы можете использовать библиотеку OpenSSL для шифрования паролей. Библиотека OpenSSL довольно плохо документирована в Ruby, но, насколько я знаю, они очень похожи на библиотеку C OpenSSL. Поскольку я думаю, что вы должны использовать OAuth, а не хранить пароли, я позволю вам найти документацию самостоятельно.

Тем не менее, для подхода OAuth, вы хотите взглянуть на камень OAuth. Google, Twitter (для которого я рекомендую использовать отличный твиттер) и facebook (у которого есть две, казалось бы, хорошие альтернативы: RFacebook и facebooker)

Другие вопросы по тегам