将DropBox中的OAuth凭据安全地存储在数据库中供以后使用

时间:2011-12-31 04:40:20

标签: security encryption oauth dropbox-api

我正在构建一个Web应用程序,它将使用DropBox API将数据保存到用户文件夹。该站点有两个部分:ASP.NET MVC前端和Windows服务。目前,我计划将oauth字符串和用户ID从授权请求转储到数据库,并在服务和网站调用中使用它,但我应该如何存储该信息?我应该加密吗?如果是这样,任何建议如何?例如,如果数据库已加密,我该如何存储加密密钥?

1 个答案:

答案 0 :(得分:3)

您是否希望始终可以访问用户的投递箱帐户,或者只有在他们进入您的系统时?我假设前者,因为你想存储o-auth令牌。在这种情况下,请参阅下面的加密讨论,了解为什么您无法真正加密它。但是,我建议你采取更安全的路线,只有当用户进入或不久之后才能访问丢弃框(即不存储持久性身份验证令牌)

安全方法

当用户登录时,从dropbox获取oauth令牌,使用它来执行他们想要的任何操作,并在必要时在注销后保留它以继续执行任务(后台同步等)。但是,一旦最后一个任务完成,请删除令牌。这意味着,如果您的服务器遭到入侵,则只会暴露用户中的loged或最近被淘汰的用户。它是一种缓解,但它是你能得到的最好的。

我相信您可以使用o-auth执行此操作,而无需每次都明确提示用户输入新令牌。如果没有,我知道你可以用opendID来做,虽然我可以看到drop box不允许这样做。

最后,如果这些都不起作用,您可以将o-auth密钥存储在从用户密码派生的密钥下持久加密,例如PBKDF2(具有5000次迭代)。当他们登录时,您解密它,使用它,然后删除明文副本。这样做的缺点是1)密码重置需要一个新的o-auth令牌,因为你不再拥有他们的密钥和2)用户必须登录你自己的网站并给你一个密码,这样你就可以得到密钥。他们不能使用openid。

加密

如果您想持续访问oauth tokem,那么您无法真正进行有意义的加密。正如你所说,你在哪里储存钥匙?对于Web服务,没有好的答案。对于最终用户系统,答案是从用户密码中获取密钥,您必须不存储密码(这是lastpass所做的)。您无法执行此操作,因为即使最终(wepapp)用户未进入,您也希望能够访问数据。

好的,sysadmin的密码怎么样?好吧,因为服务器一直在运行,这是毫无价值的,因为妥协仍然会显示密钥。更糟糕的是,重新启动会关闭你的应用程序,因为它需要系统管理员的密码来解密其数据,而且当系统在凌晨3点崩溃时它们不太可能。

他们使Hardware Security Modules存储密钥并对其执行加密操作,因此攻击者可以获取密钥,因为它永远不会离开HSM。但是,攻击者可以要求TPM解密o-auth字符串。你能做的最好的就是速率限制,所以攻击每小时只能达到1000个令牌(显然这个速度需要大于合法使用率)。鉴于HSM价格昂贵且因为您需要专用系统而导致托管成本高昂,这是不值得的。

在理想的世界中,您使用TPM来保存密钥,并且只有在系统未受到损害时才释放数据。不幸的是,TPM目前只支持验证是否加载了正确的程序(例如引导加载程序,然后是内核,然后是用户登陆程序)。如果该程序在加载后被破坏,它们什么都不做,这就是威胁向量。这可能会在未来5到10年内发生变化,但现在对你没有帮助。