存储外部API的密码 - 最佳实践

时间:2009-12-13 21:17:01

标签: ruby authentication service

如果我构建的应用程序可以访问Gmail,Twitter和Facebook等部分数据,我希望用户只需输入一次身份验证信息,并在几天或几周后重置,在Ruby中动态地执行此操作的最佳方法是什么?

我看到很多人只是拥有客户/用户凭据的配置文件,如下所示:


gmail_account:
    username: myClient
    password: myClientsPassword

这似乎是a)它非常不安全,而且b)如果我想为成千上万的用户存储这类信息,它就行不通。建议的方法是什么?

我希望能够在这些服务之上构建一个接口,因此每次用户进行交易时都必须输入凭据。

5 个答案:

答案 0 :(得分:6)

此类服务正在提供OpenAuth授权。强烈建议您查看它。

答案 1 :(得分:6)

如果您对黑客进入您的数据库/文件系统时的潜在责任感到满意,那就去吧。平心而论,您还应该向您的用户披露他们的密码将存储在您的系统中,并让他们决定是否要为您的程序提供信任级别。

但为什么这样做呢? Facebook Connect和Twitter&使用OAuth的Google根本不需要存储用户密码。在某些时候,用户的cookie将过期(或者他们将尝试从另一台计算机访问您的网站),他们将不得不重新进行身份验证。您无法阻止重新身份验证 - 相反,您应该让最终用户尽可能轻松地进行处理。

答案 2 :(得分:2)

安全

我认为你的应用程序需要知道明文密码。然后就无法以某种简单的方式存储它。

  • 以某种编码方式存储,例如。 Base64,这可以保护您在用眼睛浏览数据库时不知道密码,但它不能保护您免受其他任何侵害。
  • 确保文件无法从任何其他用户读取
  • 加密您的硬盘,因此没有人可以通过窃取您的硬盘来获取密码。您的计算机在启动时需要输入密码。

贮藏

在文件系统中存储大量数据没有任何问题。为了获得更好的性能,您可以执行以下操作

  • 每个用户一个文件,因此文件系统而不是ruby需要搜索数据
  • 制作很多子目录。如果将多个文件放入一个目录,某些文件系统性能会受到影响。例如。将文件'abcd'放入'a / b / c / d'

您可以使用数据库而不是文件系统

答案 3 :(得分:1)

这就是它的工作方式,例如对于fetcmailrc,它必须是chmod到600(只有他的所有者可以重新编写和写入)。是的,它包含普通密码。

答案 4 :(得分:0)

我强烈建议您使用OAuth,但如果您必须存储密码(请绝对确定您需要这样做),您可以使用OpenSSL库来加密密码。 OpenSSL库在Ruby中的文档很少,但据我所知,它们与C OpenSSL库非常相似。由于我认为你应该使用OAuth,而不是存储密码,我会让你自己找到文档。

但是,对于OAuth方法,您需要查看OAuth gemGoogleTwitter(我建议你使用优秀的Twitter宝石)和脸谱(它有两个看似不错的选择:RFacebookfacebooker