我*必须*在我的数据库中存储第三方凭据。最好的办法?

时间:2010-01-03 05:52:44

标签: python security google-app-engine authentication passwords

我的应用必须从第三方读取SSL网址。如何在我自己的数据库中最好地存储第三方凭据,以保护第三方凭据不被泄露?考虑绝对的安全性和实用性。单向散列凭证无用,因为我必须将凭证恢复为明文以进行SSL调用。我在谷歌应用引擎上使用python,我的应用程序使用谷歌凭据进行身份验证。

  • 使用例如加密凭证AES并将加密密钥保存在其他地方(只是移动问题),或derive it from the credentials and keep the algorithm secret(只是移动问题)
  • 使用synchronous stream cipher加密凭据,从凭据中导出(非)熵并keep the algorithm secret(只是移动问题)
  • 在一个专门用于存储第三方凭据的单独的网络应用程序上,提供一个SSL网址以接收第三方凭据,此网址使用谷歌凭据访问(与我的应用程序相同),并可以使用authsub或其他东西将授权转移到其他网络应用。这听起来更安全,因为它更难以破解一个简单的简单webapp,如果我的复杂的主应用程序受到损害,第三方凭据不会暴露。

您如何看待所有方法?

4 个答案:

答案 0 :(得分:3)

如何使用凭据?如果他们的使用仅由原始所有者触发(例如,您正在存储银行卡号并且他们正在进行第二次购买),那么他们可以在该点提供用作加密密钥的密码。然后,您将永远不需要在本地存储该密钥,而单独的数据库内容对攻击者来说是无用的。

答案 1 :(得分:2)

这是一项艰巨的任务,没有任何方法可以帮助您省去确保没有薄弱环节的麻烦。对于初学者,我不知道在Google上托管是否是最好的方法,因为你将失去控制权(我真的不知道App Engine的设计是否考虑到了所需的安全级别,你应该会发现out)并且可能无法进行渗透测试(你应该这样做。)

拥有一个单独的小应用程序可能是一个好主意,但这并不能避免您在这个较小的应用程序中以某种方式加密凭证本身。它只是简单地为您购买,这反过来使事情更容易分析。

我个人会尝试设计应用程序,以便密钥在每次使用后随机变化,采用one time pad方法。您没有足够详细地指定应用程序以确定这是否可行。

答案 2 :(得分:2)

如果您需要可逆地存储凭据,那么根本就没有解决方案。使用AES并将秘密密钥保存在收费良好的武装警卫之下。

如果你使用Windows我会查看Cred * Win32 API(advapi32.dll)它至少可以让你对Windows系统密钥进行密钥管理,其中TPM和/或启动密码可以提供防止低级别攻击的保护(被盗磁盘)驱动器)

显然,如果您的应用程序或其运行的安全上下文受到损害,上述任何一项都不会有太大帮助。

答案 3 :(得分:2)

涵盖此类情况的一本体面的书是Cryptography In The Database

相关问题