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

标签 security encryption oauth dropbox-api

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

最佳答案

您希望始终有权访问用户的投递箱帐户,还是仅当他们登录到您的系统时才有权访问?我假设是前者,因为您想存储 o-auth token 。在这种情况下,请参阅下面的加密讨论,了解为什么您不能真正对其进行加密。不过,我建议您采取更安全的路线,仅在用户登录时或登录后不久访问投递箱(即不存储持久身份验证 token )

安全方法

当用户登录时,从保管箱获取一个 oauth token ,使用它来执行他们想要的任何操作,并在必要时在注销后保留它以继续执行任务(后台同步或其他)。但是,一旦最后一个任务完成,请删除 token 。这意味着,如果您的服务器受到威胁,只有登录的用户或最近注销的用户会暴露。这是一种缓解措施,但它是你能得到的最好的。

我相信您可以使用 o-auth 来完成此操作,而无需每次都明确提示用户输入新 token 。如果没有,我知道你可以使用 opendID 来做到这一点,尽管我可以看到下拉框不允许这样做。

最后,如果这些都不起作用,您可以使用 PBKDF2(大约 5000 次迭代)在从用户密码派生的 key 下存储持久加密的 o-auth key 。当他们登录时,您将其解密、使用,然后删除明文副本。这样做的缺点是 1) 密码重置需要新的 o-auth token ,因为您不再拥有其 key ,2) 用户必须登录您的网站本身并为您提供密码,以便您可以派生 key 。他们无法使用 openid。

加密

如果您想要持续访问 oauth token ,您实际上无法进行有意义的加密。正如您所说,您将把 key 存储在哪里?对于网络服务来说,没有好的答案。对于最终用户系统,答案是从用户密码中导出 key ,而您不得存储该 key (这就是 Lastpass 所做的)。您无法执行此操作,因为即使最终 (wepapp) 用户未登录,您也希望能够访问数据。

好的,那么系统管理员的密码呢?因为服务器一直在运行,所以这是没有值(value)的,因为妥协仍然会泄露 key 。更糟糕的是,重新启动会导致您的应用程序崩溃,因为它需要系统管理员的密码来解密其数据,而当系统在凌晨 3 点崩溃时,这些密码就不太可能是他们的了。

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

在理想的世界中,您会使用 TPM持有 key 并让它仅在系统未受到损害的情况下才释放数据。不幸的是,TPM 目前仅支持验证是否加载了正确的程序(例如引导加载程序,然后是内核,然后是用户态程序)。如果该程序在加载后受到损害,他们什么也不做,这就是这里的威胁向量。这可能会在未来 5 到 10 年内发生变化,但现在对您没有帮助。

关于security - 将 DropBox 中的 OAuth 凭据安全地存储在数据库中以供以后使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8686327/

相关文章:

c# - 在程序文件中包含 SQL 用户(具有有限权限)的安全影响

mysql - Wordpress ==> SSL ==> MySQL 这个配置可行吗?

docker - Docker Content Trust 中是否有两个根 key ?

CS50破解问题。需要有关如何解密 2-4 个字符的单词的帮助

java - 谷歌日历API : How to create/edit/delete events without Google password?

android - 使用 Temboo 在 Facebook 和 Twitter 上发帖

java - Spring Security Login with a twist : users must activate their account before login

windows - 如何获取 Internet Explorer 支持的 SSL/TLS 密码列表

.net - 使用 Windows Crypto API 的 Windows 2000 和 Windows 2003 RC2 加密/解密?

ruby-on-rails - 带有 omniauth linkedin Ruby gem 的大型个人资料图片