我正在开发一个与许多外部系统API交互的系统:s。他们中的大多数都需要某种身份验证。为了便于使用,有一个“应用程序可广泛访问”的AppConfig,它存储配置信息以及外部系统的凭据。
我的问题是,将用户名和密码(以明文形式)存储到应用程序配置文件中的外部系统是不是一个坏主意。如果是这样,你如何避免它?
要访问配置文件,您必须危及服务器的文件系统或其他服务器(当然还有任何开发人员的系统)上的git存储库。我一直在考虑加密配置文件中的密码不会增加安全级别,因为加密密钥也必须存储在某个地方。我错了吗?
我非常感谢您解释如何解决此问题的答案。
解决方案
好的,这是我的最终解决方案。我使用OpenSSL创建了一个简单的库来加密和解密我的敏感数据。加载配置时,将从用户检索密钥,但在存储在文件中的生产服务器上除外。它仍然不是最佳解决方案,但它比我以前的“解决方案”更好。
感谢您的回答。我会接受Wayne的回答,因为它是最有用的。
答案 0 :(得分:5)
良好的安全性很难。
正如布鲁斯施奈尔所说,“安全是一种权衡。”您必须决定您希望获得此信息的安全程度,以及您希望花多少时间来保护所述信息。而且你绝对不想让密码只是以纯文本形式放在那里,这是一个禁忌。如果您处于可以接受用户身份验证的情况,那么您就处于这种情况。
尽管安全性很难,但您可以做一些事情。
1)使用某种类型的编译程序进行加密/解密。您不希望有人打开Python / perl脚本并说“啊哈,这只是一个简单的XYZ加密”,尽管理想情况下您不需要简单的加密。
2)通过默默无闻的安全性不是真正的安全,但它可以帮助对抗随意的窥探。例如,命名文件“passwords.txt”并不是一个非常好的主意,但加密密码然后使用隐写术来隐藏用户/传递某些图像文件会更好。
3)查找强大的加密/解密算法。其中一些已经在大多数语言中实现,您只需导入一个库。这可能是坏的或好的,取决于你认为你想要这些东西的安全性。
但老实说,这个系统非常糟糕 - 安全明智。理想情况下,你有一个双方认证,然后信任的中间人做所有的转动和交易。例如,当您登录计算机时,您告诉计算机您是授权用户。从那里你可以运行你的所有程序,他们不会询问或关心你的用户/通行证组合 - 只是你是一个授权用户。他们从操作系统(中间人)那里获得这些信息。哎呀,即使SO使用openID来决定你是一个受信任的用户 - 他们不关心你在其他网站上的凭据,只有其他网站说“是的,这是一个有效的用户。”
如果您有选项,我会认真考虑切换您的身份验证模型。如果没有,祝你好运。
答案 1 :(得分:1)
关于实时示例,Web服务器以纯文本形式在服务器上存储数据库登录详细信息。如果有人获得了访问您服务器的权限,那么无论如何都会被搞砸。但保护这些密码免受不必要的机会入侵者的侵害,我个人喜欢额外的层感觉更安全。比抱歉更安全,对吧?
由于这些密码适用于外部系统,因此使用另一层保护这些密码是谨慎的:加密。是的,通过默默无闻的安全性是不好的,但你不认为它是一个很好的威慑如果有人不得不偶然发现它们 - 纯文本密码只是要求采取。
我建议使用1024位加密,a couple good algorhytms。我还建议对您加密的每个条目使用64/128位random salt,这样即使一个条目的密码是暴力强制的,该解决方案也不适用于其他条目。随机腌制可防止彩虹桌攻击,这会迫使你的饼干使用蛮力,更耗时。
是的,这些注意事项看起来很偏执,但如果我试着破解我自己的密码(当然是为了研究兴趣),我可以想象一些有恶意的人会尝试什么。
修改: An example of how the salt makes encryption more secure, even if the encryption key is known.
答案 2 :(得分:-1)
某些webbservers需要在启动时加载对称加密的证书。为了解决这个问题,他们要求在启动时输入密码。所以它只存储在内存中。
优点:
ps fax
。缺点: