我的应用程序使用用户名和密码连接到 FTP 服务器。我可以创建一个加密例程来加密和解密密码,但是任何有权访问源代码和加密密码的人都可以解密密码。
有没有一种简单的方法可以防止每个人都知道应用程序使用的整个密码?(我认为如果多个人知道部分密码是可以的。)
编辑:我知道 FTP 不安全。理想情况下,我想要一种可以在需要用户名和密码的任何情况下工作的技术(例如数据库连接)。
不需要。应用程序用户所要做的就是嗅探他们自己的网络流量(使用 Wireshark 等很容易做到)。
您确实需要一种方法来为每个用户提供某种独特的令牌。
编辑 - 更多信息:
任何依赖于每个应用程序副本都相同的“秘密”登录信息的系统在设计上存在缺陷。为了保证安全,您的应用程序的每次安装都必须有一个唯一的秘密,用于向服务器进行身份验证。您如何实现这一点取决于您如何许可/分发您的应用程序。这是我将如何做到的。(通过 SSL 连接执行所有通信)。
替代步骤 3 是:应用程序从步骤 2 提交信息,服务器发回 info + salt 的哈希签名。哈希签名现在是您应用程序的密钥。
重要的是所有用户之间没有共享“秘密”。
您可以在此处参考我的旧问题和答案。如何在 Winforms 应用程序中存储密码?. 但是,也期待其他一些想法。
不应该至少有一个人可以访问密码或密钥吗?我们的开发人员无权访问生产服务器。这允许知道密码的系统人员在部署软件时设置密码。
将软件编码为可配置的,然后将您的开发人员拒之门外。
不,没有简单的方法:您可以随心所欲地混淆事物,但是如果应用程序在任何时候都可以使用明文密码,而无需访问其自己的源代码以外的任何资源,则可以通过以下方式提取它任何可以访问相同源代码的人。
当使用像 FTP 这样的协议时,无论如何,整个练习有点毫无意义:任何能够下载Wireshark的人都可以在几秒钟内从网络线路上嗅出凭据,如果不是更短的话。
正确解决问题的步骤:
编辑(修改原始问题后):我的回复的第一段同样适用于数据库密码等。这些情况的解决方案变得更加特定于平台。如果您的特定数据库/任何东西/操作系统组合不支持安全登录,那么您无能为力。
例如:在 Windows 上,SQL Server 支持 NTLM 身份验证,允许您根据现有的 Windows 帐户设置数据库访问权限,让您自动安全存储和传输相对难以绕过的密码。如果不能使用 NTLM 身份验证,您可以做的最好的事情(如 .NET Framework 上的推荐做法)是将密码存储在配置文件中,并使用特定于计算机的密钥进行加密。但是,使用调试器可以轻松绕过“保护”,因为在某些时候需要明文密码。
我尝试了很多方法,我认为加密不是这种情况下的方法。相反,将密码存储在配置文件中,例如 web.config/app.config/etc 或 Windows 注册表,或 /etc 中的文件或开发人员无权访问的任何其他位置(在生产环境中) , 但你做了。
他的所作所为是偏执狂的主要原因,无用的偏执狂。如果您不信任您的雇员来保护您的数据安全,请找其他人。
这里的问题不是您可以使用软件解决的问题,而是人力资源问题。例如,每个拥有部分密码的两个人一定会及时找到彼此,在这种情况下,现在两个人将知道整个密码。
正如您自己指出的那样,即使您要做到这一点,所以没有一个人拥有密码(当然,首先实际上将密码设置到服务器的人除外......)仍然很容易通过网络拦截.
这是“我不想让任何人访问计算机”的老问题,只能通过将计算机从所有东西上拔下,将其焊接到钢盒中,在上面浇注混凝土,然后将东西射入深空来完成。
本质上,没有。你可以让它变得困难,但是任何在其他人的计算机上运行代码的方案都可能受到攻击。FTP 服务器如何知道它是在与您的应用程序通信,而不是与从您的应用程序中窃取他们需要的东西的人通信。
不,没有办法安全地做到这一点。ftp 无论如何都不是一个安全协议,因此人们不需要源代码来查看您的用户名和密码,只需一个本地网络嗅探器即可。您可以通过使用 ssh 隧道来避免该问题,但是如果您发送源代码,那么对于有权访问它的人来说,从中获取用户名和密码总是微不足道的。即使没有源代码,甚至使用安全协议,具有反汇编器/调试器和一些空闲时间的专用攻击者仍然能够从可执行文件中获取此信息。如果用户名和密码必须是安全的,即使被混淆,也不要将其包含在代码中!
实际答案是否定的。标准的 FTP 客户端服务器通信实际上以未加密的形式通过网络传递用户名和密码。因此,即使您尝试使用某种方案来加密应用程序中的实际数据,任何拥有 Ethereal 副本的人都能够嗅出它。
无论您使用哪种加密方式,都需要先对密码进行加密,然后您的应用才能连接到 ftp。任何用户都可以在调试器中运行您的应用程序,跟踪到该点,然后从内存中选择密码。这样一来,您的方案的完全安全性是不可能的。
话虽如此,您可以将加密的密码放在运行时读取的配置文件中。让开发人员连接到不同的 ftp(或使用稍后被删除的不同帐户),并在部署应用程序时将要保护的加密密码放在配置文件中。
一种方法是将应用程序托管在服务器上。如果密码存储在服务器的受限区域中,那么使用该应用程序的人将无法访问它。事实上,除了通过提供的接口外,他们将无法访问应用程序。这就是网络应用程序如此受欢迎的原因之一。
在这种特殊情况下,他们仍然可以使用源代码,您只需要确保密码不与源代码一起存储,而是仅存储在安全服务器上,并且只能由托管应用程序的帐户访问服务器。
只是为了抛出想法:
顺便说一句,ftp 并不安全。您需要 sftp 或 ftps 以避免传输明文。
我猜你已经看到足够多的“不”答案了。我想指出(不直接回答您的问题)类似的问题已经(几乎)通过 Web-/应用程序服务器中的 jdbc-datasources 解决了:这些资源,基本上是连接工厂,提供已连接的数据库应用程序无需担心任何连接设置,包括名称和密码。连接是由 appserver 建立的,appserver 也会读取配置文件并知道密码。
我不知道在其他环境(或适用性)中的词汇,但正如你所问的语言不可知论者并且我没有直接回答你的问题,我认为将示例限制为 Java 是可以的。
如果您找到/编写提供 ftp 连接的类似抽象,您可能会阻止具有源代码的程序员知道密码(因为仅使用某些“容器”提供的连接对象)。但是,它无助于防止窃听或对正在运行的应用程序具有调试访问权限的人。
希望这会有所帮助,即使它没有直接回答并且不是严格的“是”;-)
也许这个答案会根据您的环境有所帮助。但最终,因为人们参与了这个过程,所以答案是“不太可能”。
不确定您需要什么...如果您正在寻找一种硬编码私人密码的方法,请忽略我的评论。
但是,如果您正在寻找一种存储密码的方法...
我认为,您正在寻找的是保存密码的哈希而不是密码本身。这样,即使程序员有你的密码检查算法和数据库中的密码哈希,他也无法解密密码。