【问题标题】:How can we store password other than plain text?除了纯文本,我们如何存储密码?
【发布时间】:2010-04-18 21:47:30
【问题描述】:

我在 stackoverflow 上找到了很多关于如何存储用户密码的帖子。但是,我需要知道存储我的应用程序需要通过 Web 与另一个应用程序通信的密码的最佳方式是什么?目前,我们的网络应用程序需要将数据传输到远程网站。为了上传数据,我们的 Web 应用程序从文本文件中读取密码并创建带有有效负载的标头并通过 https 提交。

文件系统上的纯文本密码是问题所在。有什么方法可以更安全地存储密码?

这是一个linux操作系统,应用程序是用python编写的,没有编译。

进一步说明: 根本没有用户参与此过程。存储在文件系统中的密码由其他 Web 应用程序用于验证发出请求的 Web 应用程序。用下面评论者的话来说: “在这种情况下,应用程序是另一个远程应用程序的客户端。”

【问题讨论】:

  • 您使用什么语言/技术进行上传?
  • 我还有一个问题:您是否可以控制将数据传输到的网络应用程序?因为签名方案(您的应用程序签名和网络应用程序检查签名)似乎比发送密码更好......虽然您仍然需要存储签名密钥,但是嘿有应用程序确实可以帮助(google czar来介意)
  • 是的,这两个 Web 应用程序都在我们的控制之下……也就是说,我们对两者都进行了编程。

标签: linux security authentication


【解决方案1】:

从问题看来,您需要以这样的方式存储密码,以便可以在与另一个站点的自动交易中读取和使用它。您可以加密密码并将其加密存储在文件中,然后在使用之前使用存储在系统其他位置的密钥对其进行解密。这给使用密码访问文件的人带来了困难,因为他们现在必须找到使用的密钥和加密算法,才能解密。

作为防御,更多的弱防御总是比一个强大的防御在突破时失败。此外,我还将保护包含密码的文件,而不是密码本身。配置您的网络服务器以禁用提供包含密码的文件的可能性,并尝试设置需要该文件在单独帐户下运行的进程,因此您可以将对该文件的访问限制为仅运行该进程的帐户和管理员帐户。

【讨论】:

  • +1 用于加密文件中的密码,并在使用时解密 - 我应该将其包含在我的答案列表中。
  • 您能告诉我您将使用哪种方法来加密密码,以便我在需要时也可以解密它吗?谢谢!
  • -1 这不是密码学解决的问题。攻击者将能够像试图保护的密码一样轻松地获得密钥。这是一个文件权限和用户访问控制的工作。
  • 同意@Rook - 这不是一个安全的解决方案。如果您的加密密码被泄露,那么获取密钥很容易。文件系统保护无济于事,因为无论您做什么,网络服务器都需要访问密码。如果网络服务器可以访问,那么潜在的攻击者也可以访问。
  • 我赞成这个答案,因为我认为它是纵深防御战略的重要组成部分。如果加密密钥与密码文件存储在不同的位置,并且两者都位于与使用它们的进程不同的位置,则攻击者需要采取更多步骤才能造成任何损害。
【解决方案2】:

我不认为你会找到一个万无一失的方法来做到这一点。我会建议结合一些事情来实现“默默无闻的安全”:

  • 将密码文件存储在另一台计算机上,而不是使用它的计算机上
  • 将文件路径存储在应用程序机器上的单独配置文件中
  • 使用权限将配置和密码文件的访问权限仅限于您的进程
  • 如果您的系统允许,请审核文件访问(记录谁接触过文件)
  • 为文件夹和文件取一个无害的名称 (/usr/joe/kittens.txt?)
  • 阻止对计算机的物理访问(异地托管或锁定的壁橱等)

【讨论】:

    【解决方案3】:

    您可以使用双向密钥加密算法,如 RSA, 密码被加密(通过密钥,存储在用户的大脑中)存储在文件系统中,但要解码密码,用户必须输入密钥。

    【讨论】:

    • 对不起,我不明白这个。这是将数据发送到远程服务器的自动化过程。中间不会有人打字。我误会了吗?谢谢
    • 它存在用户必须自己提供输入的问题,但没有一种方法可以真正安全并避免这种情况(如果应用程序可以在没有用户交互的情况下检索密码,那么任何人都可以反向 -工程应用程序也可以)。
    • 这并没有解决问题,只是中继问题。后续问题是:如何存储解密密码所需的密钥?
    【解决方案4】:

    至少你应该使用权限(如果你在一个支持它们的文件系统上)来确保你是唯一能够读取文件的人。

    此外,如果您的应用已编译,则使用硬编码密码短语加密密码不会太难。如果代码没有被编译,这个方法就没有真正的帮助,因为潜在的攻击者可能只是读取源代码并确定加密。

    【讨论】:

    • 这是一个基于 linux 的操作系统。而且,此应用程序未编译。感谢您的权限建议。
    【解决方案5】:

    您可以将其存储为哈希算法的结果,这是一种单向算法(例如 MD5 或 SHA)。在身份验证时,您计算用户键入的密码的 MD5,并检查与您存储的该用户的 MD5 密码哈希是否相等。如果相等,密码就可以了。

    有关拥有算法的更多信息,您可以访问:

    【讨论】:

    • 抱歉,问题是在文件系统上存储密码...其他网络应用程序需要此密码才能进行身份验证。
    • 此方法不会强制您的传输协议或文件系统数据存储。只是算法,您可以使用它从您的秘密字符串中计算安全快捷方式。如果您对此选项的实现没有错误(错误 == 不使用种子)。您可以知道,黑客不会为您的快捷方式计算原始字符串。从 2 个相同的原始字符串中,您可以使用相同的快捷方式。
    • 哈希在这里不起作用; OP 需要能够取回原始密码,而 MD5/SHA 不允许您这样做。在这种情况下,应用程序是另一个远程应用程序的客户端。
    【解决方案6】:

    您的 Web 应用程序是否托管在场中?如果不是,那么DPAPI 等技术将允许您对密码进行加密,以便只能在加密的机器上对其进行解密。

    从记忆来看,在网络场中使用它可能会出现问题,因为您需要重新加密每个服务器的值。

    如果它是一个网络农场,那么您可能希望使用其他答案中建议的某种形式的 RSA 加密。

    编辑:DPAPI 仅在您在 Windows 上托管时才有效...

    【讨论】:

      【解决方案7】:

      Protecting the Automatic Logon Password

      服务器应用程序可以使用 LsaStorePrivateData 函数来存储客户端和机器密码。

      仅限 Windows

      【讨论】:

        【解决方案8】:

        我认为您没有理解所提供的答案。您永远不会在任何地方存储纯文本密码,也不会将其传输到另一台设备。

        您写道:抱歉,问题是存储 文件系统上的密码...这个 需要密码才能进行身份验证 另一个网络应用程序。

        你不能指望文件系统保护来保证纯文本的安全,这就是为什么其他人回应说你需要 SHA 或类似的。如果您认为哈希密码不足以进行身份​​验证,则说明您不了解相关算法:

        1. 从用户那里获取密码P
        2. 存储加密(例如加盐哈希) 密码Q相对某处 安全
        3. 忘记 P(甚至清除缓冲区) 以前读过)
        4. 发送Q到远程主机H
        5. H 从用户那里获取密码 P' 需要
        6. H 从 P' 计算 Q',比较 Q' 到 Q 表示平等

        【讨论】:

        • 提问者似乎在询问您的第 2 步:“将 ... 密码存储在相对安全的地方”。问题是,无论密码的哈希值如何,黑客所需要的只是哈希后的字节。如果“某处”的安全性受到威胁,黑客可以向外部应用提交他们喜欢的任何内容,而无需知道原始纯文本密码是什么。
        • 我一定没有解释我的观点。这也解决不了问题。需要以纯文本形式存储在我们文件系统上的密码来验证向其他 Web 应用程序发出请求的 Web 应用程序。没有用户参与。我们通过 SSH 将此密码写入文件系统,并且从未由第三方/应用程序提供给我们。同样,没有用户参与。谢谢。
        猜你喜欢
        • 2010-10-31
        • 2012-05-07
        • 2010-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 2013-10-18
        相关资源
        最近更新 更多