【问题标题】:Storing a saved password in Open Source application在开源应用程序中存储已保存的密码
【发布时间】:2011-11-07 15:42:55
【问题描述】:

我正在编写一个开源的 C# 应用程序,我需要能够为每个用户存储已保存的登录信息。通常我只会加密密码,然后将其存储在用户设置文件中,但我担心由于代码是开源的,它有点破坏了加密它的意义。因为任何人都要做的就是查看代码并获取加密密钥。

当然,它至少会比以纯文本形式存储的密码更难。但是有没有什么像样的方法来加密密码,但即使你有来源,至少仍然很难解密它?也许能做到,至少差不多 不可能在除加密的那台计算机上解密吗?

编辑: 澄清...我存储的是客户端密码,而不是用于验证他们登录服务的密码。它是我无法控制的预先存在的 Web 服务的客户端。我只想在本地存储密码以进行自动登录……就像任何聊天客户端一样。

编辑 2: 非常抱歉之前不清楚。但是密码必须在某些时候以明文形式检索,并且哈希不是一种选择:(即使服务会让我传递密码哈希,这会有点破坏目的,因为哈希与密码一样好:P

【问题讨论】:

    标签: c# encryption passwords


    【解决方案1】:

    你所问的基本上是不可能的。

    如果需要解密,则没有方法可以将密码安全地存储在客户端计算机上。由于您需要它来连接到服务,而我认为该服务不支持 SSL,这进一步加剧了这种情况。在这种情况下,使用网络分析仪可以轻松找到密码。

    我玩的游戏(当然是封闭源代码)需要登录,密码保存在某处,但使用每次安装唯一的密钥加密。我忘记了密码一次,所以我只使用了 Wireshark,瞧 - 我可以看到纯密码。

    这也让我想起了人们抱怨在Google Chrome 中泄露密码很容易......他们显然不知道更好。您可以尝试所有想要的巧妙技巧,但是一旦有人可以访问机器,任何应用程序的安全性都会被抛到一边。

    因此,考虑到这一点,我会保持加密和解密非常简单。充其量,您可以创建一个从 unique to the machine 派生的密钥,因此窃取加密密码的人将无法在没有访问所述唯一密钥的情况下对其进行解密。

    【讨论】:

    • 幸运的是,该服务确实提供 SSL。是的,我知道唯一完全安全的方法是让用户每次都输入密码,但我认为大多数人都愿意为此放弃一点安全性。
    • 所以从服务器提供某种具有某种有效性的令牌...它不是防火的,但它可以得到尽可能好的效果
    • 能否请您提一些我可以用来加密密码的算法?
    【解决方案2】:

    如果您在 Windows 中使用此应用程序,您可以使用 DPAPI 代表用户存储敏感数据:

    How To: Use DPAPI to Encrypt and Decrypt Data (C#/VB.NET)

    也只存储哈希而不是完整密码是个好主意!

    【讨论】:

      【解决方案3】:

      我认为,例如,如果您使用 Rijndal 并创建随机盐值并从机器特定的事物(例如某些硬件 ID)中派生密钥,那么即使您知道它是如何工作的,也很难解密,因为您缺少信息硬件。

      但您可能会考虑仅存储密码的哈希值并至少迭代 1000 次。哈希值无法恢复为原始密码。

      还有一个想法: 是否可以将实施留给谁会使用您的源代码并抽象化加密?如果您提供构建的捆绑包以供下载,那么当然不起作用。但话又说回来:在构建中,您可以使用自己的“秘密”加密并在源代码中将其抽象化。

      【讨论】:

      • 不明白你对哈希的意思......我在某些时候需要密码的实际明文,因为它必须从我的客户端传递给服务(这是一个加密的连接)并且不能是哈希。
      • 从您收到的密码中,再次计算哈希值并将其与您存储在数据库中的哈希值进行比较。如果它们匹配,则密码匹配。当然,如果您需要密码才能从服务器的其他地方登录,这对您没有帮助。
      • 他部分地改变了问题,真的澄清,投反对票是不公平的。
      【解决方案4】:

      也许您可以使用某些机器特定的值来加密密码,例如 mac 或 sth.. 如果有人获得源密码和加密密码但没有完全访问机器密码应该是安全的。

      【讨论】:

      • mac 值不安全。想想获取一台电脑的mac值是多么容易
      • 你说得对,我还处于非开源思维中。无论如何,仍然是获取特定于机器的值。
      【解决方案5】:

      你可以使用头巾娃娃加密。您用另一个密码加密密码,然后用另一个密码加密,并多次这样做,最终以明文形式写入最后一个密码。任何想要访问原始密码的人都会厌倦所有的解密并在获得原始密码之前放弃。

      【讨论】:

      • 不知道我应该丢分,因为你没有幽默感。
      猜你喜欢
      • 2012-03-06
      • 2010-10-06
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多