4

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

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

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

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

解决方案

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

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

4

3 回答 3

5

良好的安全性很难。

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

尽管安全性很困难,但您可以做一些事情。

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

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

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

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

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

于 2010-06-23T13:14:39.637 回答
1

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

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

我推荐使用 1024 位加密,有几个不错的算法。我还建议对您加密的每个条目使用 64/128 位随机盐,这样即使一个条目的密码是暴力破解的,该解决方案也不适用于其他条目。Random Salting 可防止 Rainbow table 攻击,这会迫使您的饼干使用蛮力,更耗时。

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

编辑: 盐如何使加密更安全的一个例子,即使加密密钥是已知的。

于 2010-06-23T13:57:14.427 回答
-1

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

优点:

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

缺点:

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