【问题标题】:Prevent programmers from knowing passwords used at runtime防止程序员知道运行时使用的密码
【发布时间】:2010-09-16 08:28:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: security passwords


    【解决方案1】:

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

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

    编辑 - 更多信息:

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

    1. 应用程序首次启动 - 它发现它没有保存任何身份验证信息。
    2. 应用会提示您输入注册码、电子邮件地址和/或您想要识别用户的任何方式。
    3. 应用生成一个公钥/私钥对,并将公钥和您在第 2 步中的 ID 信息提交给服务器。
    4. 服务器会记住您的密钥并从现在开始使用它来识别您的应用。

    替代的第 3 步是:应用程序从第 2 步提交信息,服务器发回信息 + 盐的哈希签名。哈希签名现在是您应用的密钥。

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

    【讨论】:

      【解决方案2】:

      您可以在此处参考我的旧问题和答案。 How to store passwords in Winforms application?。但是,也期待其他一些想法。

      【讨论】:

        【解决方案3】:

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

        将软件编码为可配置的,然后让您的开发人员参与进来。

        【讨论】:

        • 密码需要以某种方式访问​​,但这并不一定意味着一个人需要知道整个密码。例如,有些系统让一个用户知道密码的前半部分,而另一个用户可以知道后半部分。
        • 一般来说,你不需要知道密码来设置它,你只需要知道它会是什么。在某些情况下,让具有某种“管理员”访问权限(无论在给定系统中意味着什么)的人对密码进行只写访问是有意义的。
        【解决方案4】:

        不,没有简单的方法:您可以随心所欲地混淆事物,但是如果应用程序在任何时候都可以使用明文密码,而无需访问其自己的源代码以外的任何资源,它可以也可以由任何有权访问相同源代码的人提取。

        当使用像 FTP 这样的协议时,整个练习无论如何都毫无意义:任何能够下载 Wireshark 的人都可以在几秒钟内从网络线路上嗅出凭据,甚至更短。

        正确解决问题的步骤:

        • 切换到安全协议,例如 SFTP 或 FTP+SSL
        • 使用公钥认证而不是密码(SFTP 和 FTP+SSL 都支持这一点,尽管方式略有不同)
        • 为软件的每个部署提供(最好是唯一的,以便您可以检测凭据共享并禁用被盗帐户)登录所需的私钥/证书副本
        • 在您运行的平台上以最安全的方式存储私钥/证书。在 Windows 上,这意味着使用证书存储 - 请参阅 this MSDN Magazine article 以获得很好的介绍

        编辑(修改原始问题后):我的回复的第一段同样适用于数据库密码等。针对这些情况的解决方案变得更加特定于平台。如果您的特定数据库/任何/操作系统组合不支持安全登录,那么您无能为力。

        例如:在 Windows 上,SQL Server 支持 NTLM 身份验证,允许您根据现有的 Windows 帐户设置数据库访问权限,让您自动安全存储和传输相对难以绕过的密码。如果不能使用 NTLM 身份验证,您可以做的最好的事情(如 .NET Framework 上的推荐做法)是将密码存储在配置文件中,并使用特定于计算机的密钥进行加密。但是,使用调试器可以轻松绕过“保护”,因为在某些时候需要明文密码。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            他的所作所为是导致妄想症、无用的妄想症的主要原因。 如果您不相信您的员工可以保护您的数据安全,请找其他人。

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

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

            这是“我不想让任何人访问计算机”的老问题,只能通过将计算机从所有东西上拔下,将其焊接到钢箱中,在其上浇注混凝土,然后将东西射入深处来完成空间。

            【讨论】:

            • 现在,这是有史以来最糟糕的解决方案。深空有邪恶的外星人!
            【解决方案7】:

            本质上,没有。你可以让它变得困难,但是任何在其他人的计算机上运行代码的方案都可能受到攻击。 FTP 服务器如何知道它正在与您的 应用程序通信,而不是与从您的应用程序中窃取所需内容的人通信。

            【讨论】:

              【解决方案8】:

              不,没有办法安全地执行此操作。 ftp 无论如何都不是一个安全协议,因此人们不需要源代码来查看您的用户名和密码,只需一个本地网络嗅探器即可。您可以通过使用 ssh 隧道来避免该问题,但如果您发布源代码,那么对于有权访问它的人来说,从中获取用户名和密码总是微不足道的。即使没有源代码,甚至使用安全协议,具有反汇编器/调试器和一些空闲时间的专用攻击者仍然能够从可执行文件中获取此信息。如果用户名和密码必须是安全的,请不要将其包含在代码中,即使被混淆!

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

                  无论您使用哪种加密方式,都需要先对密码进行加密,然后您的应用才能连接到 ftp。 任何用户都可以在调试器中运行您的应用程序,跟踪直到该点,然后从内存中选择密码。这样一来,您的场景就不可能完全安全。

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

                  【讨论】:

                    【解决方案11】:

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

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

                    【讨论】:

                      【解决方案12】:

                      只是为了提出想法:

                      1. 将密码存储在您为其分配的二进制文件中。
                      2. 密码可以根据时间(日期)或其他时间更改,但如果他们运行您的代码,他们也可以得到它。
                      3. 也许用公钥/私钥做点什么。(加密中的签名可以识别用户。这个信息可以在运行时检索,我想从他/她的密钥。这就像一个挑战,但你需要构建/program 另一台服务器仅用于此身份验证部分。 或许还有更广为人知的工业接受方式。

                      顺便说一句,ftp 并不安全。您需要 sftp 或 ftps 以避免传输明文。

                      【讨论】:

                        【解决方案13】:

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

                        我不知道在其他环境(或适用性)中的词汇,但正如你所问的语言不可知论者并且我没有直接回答你的问题,我认为将示例限制为 Java 是可以的。

                        如果您找到/编写了提供 ftp-connection 的类似抽象,您可能会阻止具有源代码的程序员知道密码(因为仅使用某些“容器”提供的连接对象)。不过,这对防止窃听或对正在运行的应用程序具有调试访问权限的人无济于事。

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

                        【讨论】:

                          【解决方案14】:

                          也许这个答案会有所帮助,具体取决于您的环境。但最终,因为人们参与了这个过程,所以答案是“不太可能”。

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

                          【讨论】:

                            【解决方案15】:

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

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

                            我认为,您正在寻找的是保存密码的哈希而不是密码本身。这样,即使程序员有你的密码校验算法和数据库中的密码哈希,他也无法解密密码。

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2011-06-28
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2023-04-09
                              • 1970-01-01
                              • 2020-10-02
                              • 2011-08-31
                              相关资源
                              最近更新 更多