我必须将第三方凭据存储在我的数据库中。最佳方式是什么?

7
我的应用程序必须从第三方读取SSL网址。我该如何最好地将第三方凭据存储在自己的数据库中,以保护第三方凭据不被泄露?考虑绝对安全性和实用性。单向哈希凭据是无用的,因为我必须将凭据恢复为明文以进行SSL调用。我在谷歌应用引擎上使用Python,并且我的应用程序使用谷歌凭据进行身份验证。
  • 使用例如AES加密凭据并将加密密钥保存在其他地方(只是转移了问题),或者从凭据中派生它并保持算法秘密(只是转移了问题)
  • 使用同步流密码加密凭据,从凭据中派生(非)熵并保持算法秘密(只是转移了问题)
  • 在专门用于存储第三方凭据的单独Web应用程序上,提供SSL URL以接收第三方凭据,此URL使用Google凭据(与我的应用程序相同)访问,并且可以使用AuthSub或其他方法将授权传输到其他Web应用程序。这听起来更安全,因为很难攻击一个简单的Web应用程序,如果我的复杂主应用程序被攻击,则不会暴露第三方凭据。

您认为这些方法如何?


你的问题不太清楚。SSL URL 用于加密发送到其上的凭据。 - Mitch Wheat
1
我害怕将外部凭据存储在我的数据库中。 - Dustin Getz
我无法理解第三种方法如何不是将问题移动。它只是将问题移动到另一个应用程序,而不是同一个应用程序。 - Vinko Vrsalovic
2
同意,但它将危险的东西隔离到一个简单的应用程序中,比我的复杂和有缺陷的应用程序更难被黑客攻击...我正在寻找一个合理的折衷方案。 - Dustin Getz
4个回答

3

这些凭据是如何被使用的?如果它们的使用只由原始所有者触发(例如,您存储了银行卡号码,他们正在进行第二次购买),那么他们可以在那时提供一个密码,该密码将用作您的加密密钥。然后,您永远不需要在本地存储该密钥,数据库内容仅对攻击者没有用。


当我的应用程序从已注册的地址接收到电子邮件(实际上是短信)并回复该地址时,凭据被调用。因此,我非常确定它们需要被存储。 - Dustin Getz

2
这是一项艰巨的任务,没有任何方法可以帮你省去确保没有弱环节的麻烦。首先,我不知道在Google上托管是否是最佳选择,因为这样做会放弃控制权(我真的不知道App Engine是否考虑了所需的安全级别,你应该了解一下),而且可能无法进行渗透测试(你应该要做)。
拥有一个单独的小应用程序可能是个好主意,但这并不能使你免于必须以某种方式加密这些凭据本身。它只是为你提供了简单性,从而使事情更容易分析。
我个人会尝试设计应用程序,使密钥在每次使用后随机更改,采用一种类似一次性密码本的方法。你没有足够详细地说明应用程序,以便看出这是否可行。

2
如果您需要可逆地存储凭据,那么就没有解决方案。使用AES并将秘密密钥保管在有良好薪酬的武装警卫下。
如果您使用Windows,建议查看Cred* Win32 API(advapi32.dll),它至少可以让您将密钥管理委托给Windows syskey,在那里TPM和/或启动口令可以提供对低级别破坏(盗取磁盘驱动器)的保护。
显然,如果您的应用程序或其运行的安全上下文受到破坏,则以上任何一项都没有太大帮助。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接