防止程序员知道运行时使用的密码

时间:2008-10-09 18:17:16

标签: security passwords

我的应用程序使用用户名和密码连接到FTP服务器。我可以创建加密例程来加密和解密密码,但任何有权访问源代码和加密密码的人都可以解密密码。

是否有一种简单的方法可以防止每个人知道应用程序使用的整个密码? (如果有多个人知道密码的一部分,我认为没关系。)

编辑:我知道FTP不安全。理想情况下,我想要一种适用于需要用户名和密码的任何情况的技术(例如数据库连接)。

15 个答案:

答案 0 :(得分:16)

没有。应用程序用户所要做的就是嗅探自己的网络流量(使用Wireshark等很容易)。

您真的需要一种方法为每个用户提供某种独特的令牌。

编辑 - 更多信息:

依赖于每个应用程序副本相同的“秘密”登录信息的任何系统都存在设计缺陷。为了保证安全,应用程序的每次安装都必须具有用于向服务器进行身份验证的唯一秘密。您如何实现这一点取决于您如何许可/分发您的应用程序。我就是这样做的。 (通过SSL连接执行所有通信)。

  1. App首次启动 - 它发现它没有保存身份验证信息。
  2. 应用程序会提示您输入注册码,电子邮件地址和/或您想要识别用户。
  3. 应用程序生成公钥/私钥对,并将包含您的ID信息的公钥从步骤2提交给服务器。
  4. 服务器会记住您的密钥,并使用它来识别您的应用程序。
  5. 备选步骤3是:app从步骤2提交信息,服务器发回info + salt的哈希签名。哈希签名现在是您应用的关键。

    重要的是,所有用户之间都没有共享“秘密”。

答案 1 :(得分:2)

你可以在这里引用我的旧问题和答案。 How to store passwords in Winforms application?。但是,也期待着其他一些想法。

答案 2 :(得分:2)

是否应该至少有一个人可以访问密码或密钥?我们的开发人员无法访问生产服务器。这允许被允许知道密码的系统人员在部署软件时设置密码。

将软件编码为可配置,然后让你的开发人员离开。

答案 3 :(得分:2)

不,没有简单的方法:您可以根据需要对事物进行模糊处理,但如果明文密码在任何时候都可供应用程序使用,而无需访问除其自己的源代码之外的任何资源,则可以由任何可以访问相同源代码的人提取。

当使用像FTP这样的协议时,整个练习无论如何都是毫无意义的:任何能够下载Wireshark的人都可以在几秒钟内从网络线上嗅到凭证,如果不是更少的话。

正确解决问题的步骤:

  • 切换到安全协议,例如SFTP或FTP + SSL
  • 使用公钥身份验证而不是密码(SFTP和FTP + SSL都支持此功能,尽管方式略有不同)
  • 为每个软件部署提供一个(最好是唯一的,以便您可以检测凭据共享并禁用受感染的帐户)登录所需的私钥/证书副本
  • 以最安全的方式在您运行的平台上存储私钥/证书。在Windows上,这意味着使用证书存储 - 请参阅this MSDN Magazine article以获得精彩的介绍
编辑(修改原始问题后):我的回复的第一段同样适用于数据库密码等。这些情况的解决方案更具有特定于平台的能力。如果您的特定数据库/任何/ OS组合不支持安全登录,那么您可以做的事情并不多。

例如:在Windows上,SQL Server支持NTLM身份验证,允许您根据现有Windows帐户设置数据库访问权限,为您提供自动安全存储和密码传输,这是相对难以绕过的。如果无法使用NTLM身份验证,则可以执行的最佳操作(在.NET Framework上建议的做法)是将密码(使用计算机专用密钥加密)存储在配置文件中。但是,使用调试器可以简单地绕过“保护”,因为在某些时候需要明文密码。

答案 4 :(得分:1)

我尝试了很多方法,在这种情况下我不认为加密是这样的。而是将密码存储在配置文件中,例如web.config / app.config / etc或Windows注册表,或/ etc中的文件或开发人员无权访问的任何其他位置(在生产环境中) ,但你做到了。

答案 5 :(得分:1)

他所做的是偏执狂,无用的偏执狂的主要原因。 如果您不信任您的员工以确保您的数据安全,请与其他人联系。

这里的问题不是您可以使用软件解决的问题,而是人力资源问题。 两个人,每个人都有一部分密码,肯定会及时找到对方,例如,在这种情况下,两个人现在将知道整个密码。

正如你自己指出的那样,即使你是这样做的,所以没有一个人拥有密码(当然除了那个人实际上首先将密码设置到服务器上......)它仍然很容易拦截通过电线。

这是“我不想让任何人接触到计算机”的老问题,这只能通过将计算机从所有设备上拔下来,将其焊接到钢箱中,将混凝土倒在上面,并将物体射入深处来实现。空间。

答案 6 :(得分:0)

实质上,没有。你可以使它变得困难,但任何在其他人的计算机上运行代码的方案都无法攻击。 FTP服务器如何知道它正在与您的应用程序进行通信,而不是那些已经从应用程序中删除了所需内容的人。

答案 7 :(得分:0)

不,没有办法安全地做到这一点。 ftp不是一个安全的协议,所以人们不需要源代码来查看你的用户名和密码,只需要本地网络嗅探器。您可以通过使用ssh隧道来避免这个问题,但是如果您发送源代码,对于有权访问它的人来说,获取用户名和密码总是微不足道的。即使没有源代码,甚至没有安全协议,带有反汇编/调试器和一些空闲时间的专用攻击者仍然可以从可执行文件中获取此信息。如果用户名和密码必须是安全的,请不要将其包含在代码中,即使是模糊处理!

答案 8 :(得分:0)

实际答案是否定的。标准FTP客户端服务器通信实际上以未加密的形式通过网络传递用户名和密码。因此,即使您尝试使用某种方案来加密应用程序中的实际数据,任何拥有Ethereal副本的人都可以嗅出它。

答案 9 :(得分:0)

无论您使用何种加密方式,密码都需要加密,然后您的应用才能连接到ftp。 任何用户都可以在调试器中运行您的应用程序,直到该点为止,然后从内存中选择密码。通过这种方式,您的方案的完全安全性是不可能的。

话虽这么说,您可以将加密的密码放在运行时读取的配置文件中。让开发人员连接到不同的ftp(或者使用稍后删除的其他帐户),并在部署应用程序时将要保护的加密密码放在配置文件中。

答案 10 :(得分:0)

执行此操作的一种方法是在服务器上托管应用程序。如果密码存储在服务器的受限区域中,那么使用该应用程序的密码将无法访问它。事实上,除了通过提供的界面,他们将无法访问该应用程序。这就是网络应用程序如此受欢迎的一个原因。

在这种特殊情况下,源代码仍可供他们使用,您只需要确保密码不与源代码一起存储,而只能存储在安全服务器上,并且只能由托管的帐户访问服务器上的应用程序。

答案 11 :(得分:0)

只是为了提出想法:

  1. 将密码存储在二进制文件中,在您为其分配的位置。
  2. 密码可以根据时间(天)或其他内容进行更改,但如果他们运行您的代码,他们也可以获得。
  3. 也许用公钥/私钥做一些事情。(加密签名可以识别用户。这个信息可以在运行时检索,我想从他/她的密钥。它就像一个挑战,但你需要建立/为此认证部分编程另一台服务器。 也许有更多已知的工业上可接受的方式..
  4. 顺便说一句,ftp并不安全。你需要sftp或ftps来避免传输明文。

答案 12 :(得分:0)

我猜你已经看到了足够的“不”答案。我想指出(没有直接回答你的问题)在Web服务器/应用服务器中使用jdbc-datasource(几乎)解决了类似的问题:这些是提供已连接数据库的资源,基本上是连接工厂没有应用程序的连接需要担心任何连接设置,包括名称和密码。连接由appserver建立,appserver也读取配置文件并知道密码。

我不知道在其他环境(或适用性)中的词汇量,但是当你问与语言无关并且我没有直接回答你的问题时,我认为将示例限制为Java是可以的。 / p>

如果您发现/编写提供ftp连接的类似抽象,您可能会让程序员使用源代码知道密码(因为只使用某些“容器”提供的连接对象)。尽管如此,它无法帮助防止窃听或对调试访问正在运行的应用程序的人。

希望这有帮助,即使它没有直接回答而且没有严格的“是”; - )

答案 13 :(得分:0)

根据您的环境,这个答案可能会有所帮助。但最终,因为人们参与了这个过程,答案是“不可能流血”。

  • 将用户名/密码组合保存在 配置文件。
  • 使用一个用户名/密码设置临时服务器,使用另一个用户名/密码设置测试服务器,使用另一个用户名/密码设置产品服务器。
  • 配置中的密码 文件(程序员将全部使用 know)用于登台服务器。提供给测试组的用户名/密码用于测试服务器。
  • 确保生产/测试服务器 有不同的用户名/密码。
  • 使用分发配置文件 使用该产品更正生产用户名/密码。

答案 14 :(得分:0)

不确定您需要什么...如果您正在寻找硬编码私人密码的方法,请忽略我的评论。

但如果您正在寻找存储密码的方法......

我认为,你要找的是保存密码的哈希值而不是密码本身。这样,即使程序员拥有您的密码检查算法和数据库中的密码哈希,他也无法解密密码。