【问题标题】:C# How to securly store an unchanging password?C#如何安全地存储不变的密码?
【发布时间】:2020-10-09 09:19:08
【问题描述】:

我整个上午都在看这个,我已经到了看不到树木的地步,所以向社区寻求建议和清晰的想法。

我正在编写一个应用程序,它将从第三方提供的受密码保护的 Zip 文件中读取数据。这种格式不会改变(因此不能接受这样做的建议),密码也不会改变。

由于这个 Zip 上的密码总是相同的,我的问题是在哪里以及如何存储这个安全的密码?出于明显的原因,我不想将其作为字符串存储在代码中。因为我需要实际密码,所以存储它的哈希不是路由(我不认为)。

我可能想多了,有一个简单的选择,但就像我说的我在树林里丢了我的头发:)

编辑: 为这个问题的限制提供更多背景信息:

  • 我必须读取的数据是加密的 zip 格式 文件。密码是静态的(例如,所有密码都保持不变) 文件)

  • 许多文件可能会在一天内不定期地通过

  • 应用程序的用户不知道也不允许知道 zip 文件的密码(不能输入)

  • 应用程序必须作为 Windows 服务运行并处理这些
    文件在提供时自动提供,无需任何用户
    干预。

  • 这些文件以及它们的交付和格式化方式是 3rd 派对,我无法控制更改这些参数

这些是我为该项目提供的限制条件,我需要为其提供解决方案。我已经知道在代码中存储为字符串是错误的。重复这一点,因为您的回复不是答案!

感谢社区的帮助:)

【问题讨论】:

  • 这里缺少的重要部分是您试图保护密码来自的是谁或什么。换句话说,谁或什么可以访问这台计算机但不应该访问密码?例如,应用程序的用户是否有权访问密码?如果他们有,我建议他们只需输入一次,然后您使用 DPAPI 之类的东西将其安全地存储在他们的计算机上。
  • 感谢您的意见。要回答您关于“来自”的问题,那么该应用程序不适用于更广阔的世界(例如,不是任何人都可以下载和使用的东西)。它仅供我们用户群的有限选择使用。如果我只是随便将密码存储在代码中,大多数用户甚至不会知道、关心或怀疑。但是有 1 或 2 位用户对软件开发“感兴趣”,并乐于使用基本知识指出他们已经阅读了密码。

标签: c# security passwords


【解决方案1】:

无处可去。没有办法以安全的方式存储密码并继续使用它。是的,这都是大写。您可以尝试减轻损失,但最后,如果您的应用可以解码您用来存储密码的任何内容,那么黑客也可以。

CODE 是一个糟糕的地方——不是为了安全,而是因为它真的是不可更改的。但除此之外 - 没办法。简单的。自从计算机发明以来,人们就试图隐藏东西。从来没有工作过。

【讨论】:

  • 您可能错过了我所说的“出于显而易见的原因,我不想将其作为字符串存储在代码中”。如果你这样做了,你可能已经把所有这些上限留到了另一天。
  • 即使它加密得像getm一样糟糕,除非它是一个“愚蠢”的密码,在这种情况下你可以很好地以明文形式存储它。
  • 这很公平,TomTom,我知道这不是最佳做法。但是我已经被赋予了坚持的约束(更新了 OP),我知道这不是很好,如果我不知道我会在没有任何想法或询问的情况下继续前进。但我在这里,我在问。我知道我想做什么,但我被束缚了。如果您将其作为一个具有这些约束的项目,您的解决方案是什么?感谢您的帮助:)
  • 既然你能做到的最好的就是掩盖它,我就这么做。构建一种基于源代码中的密钥加密/解密的方法。将“加密”值放入配置中。如果您需要更改配置,至少您将有一种更新配置的方法。虽然不会以微不足道的方式泄漏密钥。
【解决方案2】:

我在这里建议一件事。

您不能将密码直接存储在您的应用程序中。

您始终可以将其组合为出生日期 + 名字的前 4 个字符 + 一些其他信息的组合

【讨论】:

    【解决方案3】:

    可以encrypt sections in the configuration file。该工具仅适用于 web.config 文件,因此如果您有其他类型的应用程序,只需在运行命令之前将 app.config 重命名为 web.config,然后再改回 app.config。

    使用机器存储实质上限制了对机器管理员的访问,而使用用户存储将访问限制为仅对执行加密命令的帐户。

    使用机器存储加密:

    加密:

    aspnet_regiis.exe -pef "sectionName" "C:\Path\To\Application" -prov "DataProtectionConfigurationProvider"
    

    解密:

    aspnet_regiis.exe -pdf "sectionName" "C:\Path\To\Application"
    

    使用用户存储加密

    将此部分添加到配置文件中:

    <configProtectedData>
            <providers>
                <add useMachineProtection="false"
                     keyEntropy=""
                     name="CustomDataProtectionConfigurationProvider"
                     type="System.Configuration.DpapiProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
                />      
            </providers>
    </configProtectedData>
    

    加密:

    aspnet_regiis.exe -pef "sectionName" "C:\Path\To\Application" -prov "CustomDataProtectionConfigurationProvider"
    

    解密:

    aspnet_regiis.exe -pef "sectionName" "C:\Path\To\Application" -prov "CustomDataProtectionConfigurationProvider"
    

    用户存储注意事项

    由于只有运行命令的用户才能访问/解密数据,因此应用程序需要专用服务帐户,并且以该用户身份运行命令runas /profile /user:theusername cmd 可用于以其他用户身份启动命令提示符

    【讨论】:

    • 这个问题是如果黑客接管机器并且可以替换网站下的代码 - 他可以访问用户存储,这两种方法都无用。
    • @TomTom 但是我们又回到了最初的答案,“你不能安全地做到这一点”。在某些时候,人们不得不接受所使用方法的风险。由于它将用于解密加密的存档文件,如果黑客可以控制机器,并且您找到了一种 100% 安全的密码存储方式,在取消存档软件中设置了一个简单的断点,那么您就回到了原点.
    • 如果他能控制这台机器,无论如何,所有的赌注都没有了。在那一刻,你输了,不管你做了什么来保护东西。
    • 实际上没有。在某些机制下,机器的控制不允许人们窃取密码——这就是 TPM 派上用场的地方。钥匙进去,它可以解密,但钥匙永远不会出来。不过需要 TPM 感知软件。
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2018-05-13
    • 2016-04-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多