如何存储第三方凭据(没有api,没有OAuth)以进行自动重用?

时间:2017-04-18 13:56:28

标签: node.js security heroku web-scraping

我已经阅读了几个Stack Overflow线程,我仍然无法确定 my 案例的最佳选择。最安全的。

这是故事。我的网络应用程序旨在帮助用户自动概述某些第三方网站提供的部分数据。我需要为每个用户存储一些第三方凭据。每天晚上左右,我的服务器将连接到用户的第三方服务'代表并检索所需的数据。

大多数第三方网站都没有实施任何API或OAuth机制,所以我想做一些网页抓取。

我已经在许多地方读过,将凭据存储在数据库中并不是一个好主意 - 特别是因为我的应用程序需要访问密码(所以它必须以这样的方式加密我可以轻松地重复使用它)。

所以,我还有两个选择:

  1. 每当我访问(通过webscraping)第三方服务时,我在服务器上存储该服务发布的cookie ,以备将来重用。我对它们进行加密并将它们保存在数据库中,并在我需要时解密它们。问题是,一段时间后,Cookie可能会被拒绝过期,因此自动流程将不再有效。
  2. 我将凭据存储在环境变量中。我将在Node.js和Heroku上。这是我在另一个SO线程中找到的想法。但我对这个想法的安全性感到疑惑。 真的安全吗?除了我,没有人可以访问它们吗?如果我接触到很多用户呢?像1000个用户,有10个服务。这是存储在env变量中的10000个凭据。这似乎不是一个好主意。
  3. 我在Stack Overflow上发现了两个有趣的问题,但是我的用例并不适合100%。

4 个答案:

答案 0 :(得分:1)

存储大量在环境变量中变化和增长的数据永远不会实用,无论它是否安全,所以这几乎是不可能的,除非你有一个小的固定数量的用户。

不在数据库中存储凭据是一个非常好的建议,但Cookie 凭据,即使您将它们加密存储,您的应用也需要能够对其进行加密才能使用它。 (这与验证用户密码的情况不同,当您不需要加密它们时,您只需要查看提供的密码是否散布到您存储的相同值。)

这是一个难题,因为要使其工作,您需要存储某些形式的凭据(无论是密码还是cookie)并准备好以未加密方式使用(即使它们以加密方式存储,您需要存储密钥加密它。)

此外,您要做的事情可能是非法的。 Mayke确保您遵守您正在使用的每项服务的TOC,否则您可能会遇到法律问题。

答案 1 :(得分:1)

规划攻击者获得对服务器的管理员访问权限。您的网站对攻击者非常有吸引力,可以为用户凭据提供一站式服务,因此您需要非常好的登录凭据安全性。

存储凭据的选项有两个以上:

  1. 使用HSM作为存储或个人凭据加密密钥。

  2. 将凭据保留在另一台没有Internet访问权限的服务器上,双因素身份验证和限制管理员个人身份。速率限制对此服务器的访问并添加速率警报。通过非Internet连接以每个用户凭据访问此服务器。凭据仅可用于内存中的Internet连接服务器,而不是文件中的静止。

答案 2 :(得分:1)

我添加了另一个答案,因为也许这个可以帮到你。 您说您的网站的主要目标是概述第三方应用程序。但是,如果不是每晚更新此概述,而是在用户登录时更新它,该怎么办?它改变了一切,因为您可以使用(您网站的)用户密码作为主密码来加密(使用AES)所有其他密码。

如果这样做,服务器和客户端之间的通信必须使用SSL固定进行加密,因为攻击者可以执行MITM,获取主密码以及存储在数据库中的所有其他密码......(即使在实践中,这很难,因为你需要破解客户端和服务器)

答案 3 :(得分:0)

无论如何,以可逆的方式存储用户凭据看起来都是一个糟糕的主意。但是如果你真的想存储它们,我建议你使用环境变量解决方案。但你可以改进它。要限制您存储的数据量并且没有如您所说的1000000个变量,您只需存储AES加密密钥,将所有凭据存储在使用此密钥加密的数据库中,您只需获取此密钥(即在内存中)并解密数据库。但是这个解决方案还有另一个问题。正如我所说,这是存储在RAM内存中,所以它不是持久的,想象你的服务器必须重新启动X或Y的原因......你将丢失AES密钥以及用户的凭据......此外,如果攻击者执行内存转储,他将有权访问AES密钥......

我认为更好的想法是存储cookie(以加密方式),当这个过期时,你会提醒用户(通过邮件,电话,通知......)并要求他再次填写他的凭据。但它不是一个完美的解决方案!实际上,cookie是一种凭证,不应存储......