【问题标题】:i *must* store third party credentials in my database. best way?我*必须*将第三方凭据存储在我的数据库中。最好的办法?
【发布时间】:2010-12-31 22:26:19
【问题描述】:

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

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

您如何看待所有方法?

【问题讨论】:

  • 不清楚您在问什么? SSL URL 用于加密通过它发送的凭据。
  • 我害怕将外部凭据存储在我的数据库中
  • 我看不出第三种方法也没有解决问题。它只是将其移动到不同的应用程序,而不是同一个应用程序。
  • 同意,但它将危险的东西沙箱化到一个简单的应用程序中,比我复杂且有缺陷的应用程序更难破解......我正在寻找一个合理的折衷方案

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


【解决方案1】:

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

【讨论】:

  • 当我的应用从注册地址收到一封电子邮件(实际上是短信)时,会调用信用,然后我的应用会响应该地址。所以我很确定它们需要被存储。
【解决方案2】:

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

拥有一个单独的小型应用程序可能是个好主意,但这并不能让您不必在这个较小的应用程序中以一种或另一种方式加密凭据本身。它只是为您带来了简单性,从而使事情更易于分析。

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

【讨论】:

    【解决方案3】:

    如果您需要可逆地存储凭据,则根本没有解决方案。使用 AES 并将密钥置于高薪武装警卫之下。

    如果您使用 Windows,我会检查 Cred* Win32 API (advapi32.dll),它至少允许您将密钥管理放到 Windows syskey 中,其中 TPM 和/或启动密码可以提供针对低级别妥协的保护(被盗磁盘驱动器)

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

    【讨论】:

      【解决方案4】:

      涵盖这种情况的一本不错的书是Cryptography In The Database

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 1970-01-01
        • 2022-01-21
        • 2011-07-12
        • 1970-01-01
        • 2012-01-30
        相关资源
        最近更新 更多