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

如果我构建了一个从Gmail,Twitter和Facebook访问某些数据的应用程序,我希望用户只需输入一次身份validation信息,并在几天或几周后重置,那么最好的是什么在Ruby中动态地执行此操作的方法?

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

gmail_account: username: myClient password: myClientsPassword 

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

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

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

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

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

安全

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

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

存储

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

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

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

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

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

但是,对于OAuth方法,您需要查看OAuth gem 。 谷歌 , 推特 (我推荐你使用优秀的推特gem)和脸书(它有两个看似不错的选择: RFacebook和facebooker )