【问题标题】:How to manage passwords in application configuration如何在应用程序配置中管理密码
【发布时间】:2011-03-07 05:31:06
【问题描述】:

我正在开发一个与许多外部系统 API 交互的系统:s。他们中的大多数需要某种身份验证。为了可用性,有一个“应用程序范围内可访问”的 AppConfig 存储配置信息以及外部系统的凭据。

我的问题是,将用户名和密码(以明文形式)存储到应用程序配置文件中的外部系统是否是个坏主意。如果是这样,你如何避免它?

为了访问配置文件,您要么必须破坏服务器的文件系统,要么破坏另一台服务器(或者当然是任何开发人员的系统)上的 git 存储库。我一直认为加密配置文件中的密码不会提高安全级别,因为加密密钥也必须存储在某个地方。我错了吗?

非常感谢您解释您如何解决此问题的答案。

解决方案

好的,这是我的最终解决方案。我使用 OpenSSL 创建了一个简单的库来加密和解密我的敏感数据。加载配置时会从用户那里检索密钥,但存储在文件中的生产服务器上除外。它仍然不是最佳解决方案,但比我之前的“解决方案”要好得多。

感谢您的回答。我会接受韦恩的回答,因为它提供的信息最多。

【问题讨论】:

标签: password-protection


【解决方案1】:

良好的安全性很难。

正如 Bruce Schneier 所说,“安全是一种权衡。”你必须决定你希望这些信息有多安全,以及你想花多少时间保护这些信息。而且您绝对不想将密码以纯文本形式留在外面,这是不行的。如果您处于可以接受的情况,那么您就处于不应该进行用户身份验证的情况。

即使安全性很困难,您也可以做一些事情。

1) 使用某种类型的编译程序进行加密/解密。您不希望有人打开 Python/perl 脚本并说“啊哈,这只是一个简单的 XYZ 加密”,尽管理想情况下您不想要一个简单的加密。

2) 通过默默无闻的安全性不是真正的安全性,但它可以帮助防止随意窥探。例如,将您的文件命名为“passwords.txt”并不是一个非常好的主意,但加密您的密码,然后使用隐写术将用户/密码隐藏在某个图像文件中会更好。

3) 查找强大的加密/解密算法。其中一些已经在大多数语言中实现,您只需导入一个库即可。这可能是坏的,也可能是好的,这取决于你认为你想要这些东西的安全程度。

但老实说,这个系统真的很糟糕 - 安全方面。理想情况下,您拥有两方身份验证,然后由受信任的中间人完成所有的交易和交易。例如,当您登录计算机时,您是在告诉计算机您是授权用户。从那里您可以运行所有程序,它们不会询问或关心您的用户/通行证组合 - 只是您是授权用户。他们从操作系统(中间人)那里获得这些信息。哎呀,甚至 SO 也使用 openID 来确定您是受信任的用户 - 他们不在乎您在其他网站上的凭据是什么,只关心其他网站说“是的,这是一个有效的用户。”

如果您可以选择,我会认真考虑切换您的身份验证模型。如果没有,祝你好运。

【讨论】:

  • 感谢您提供信息丰富的回答。我在大多数观点上都同意你的观点,但仍然希望看到人们如何解决这个问题的真实例子。而且我不认为我的方法非常独特。在 Rails 中,您将数据库密码存储在纯文本配置文件中。我正在做的事情是一样的,只是针对数据库以外的其他系统。我在想的是,即使对用户名和密码进行加密也是一种“隐秘的安全性”,因为加密密钥也必须存储在某个地方。
  • 非常正确。当然,这也取决于用户的信任程度,因为有时必须有人获取数据。我想这又回到了施奈尔的说法。安全性是一种权衡,您只需决定需要多少安全性。
【解决方案2】:

关于真实的示例,Web 服务器以纯文本形式将数据库登录详细信息存储在服务器上。如果有人可以访问您的服务器,那么您无论如何都会被搞砸。但是保护这些密码免受不受欢迎的机会主义入侵者的侵害,我个人喜欢额外的一层感觉更安全。安全总比后悔好,对吧?

由于这些密码是用于外部系统的,因此谨慎的做法是使用另一层保护这些密码:加密。是的,通过默默无闻的安全性很糟糕,但你不认为它可以作为一个很好的威慑如果有人不得不偶然发现他们 - 纯文本密码只是乞求采取。

我推荐使用 1024 位加密,有a couple good algorhytms。我还建议对您加密的每个条目使用 64/128 位 random salt,这样即使一个条目的密码是暴力破解的,该解决方案也不适用于其他条目。 Random Salting 可防止 Rainbow table 攻击,这会迫使您的破解者使用蛮力,更耗时。

是的,这些预防措施似乎有些偏执,但如果我尝试破解自己的密码(当然是出于研究兴趣),我可以想象一些心怀恶意的人可能会尝试什么。

编辑: An example of how the salt makes encryption more secure, even if the encryption key is known.

【讨论】:

  • 感谢您的回复。我对加密、散列和加盐并不陌生。我用它在数据库中存储用户密码。
【解决方案3】:

一些网络服务器需要在启动时加载对称加密的证书。为了解决这个问题,他们要求在启动时输入密码。所以它只存储在内存中。

优点:

  • 主密码永远不会存储在磁盘上。
  • 无法从ps fax提取主密码。

缺点:

  • 仍然可以通过内存转储(由运行 webbserver 和 root 的用户)提取主密码。
  • 如果没有用户干预,您的进程无法自动重新启动。这可能是没有更多人选择此选项的最大原因。幸运的是,网络服务器很少崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2011-09-07
    • 2018-05-14
    • 2013-01-18
    • 2015-06-28
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多