在开源应用程序中存储已保存的密码

时间:2011-08-31 14:01:38

标签: c# encryption passwords

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

当然,它至少会比以纯文本存储的密码更难。但有没有像加密密码的好方法,但即使你有源码,它至少仍然非常难以解密?也许这样做至少会差不多 在除了加密的计算机之外的任何计算机上都无法解密?

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

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

5 个答案:

答案 0 :(得分:7)

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

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

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

这也让我想起人们抱怨在Google Chrome显示密码很容易......他们显然不知道更好。您可以尝试所需的所有聪明技巧,但是一旦有人访问该计算机,任何应用程序安全性都会被抛出窗口。

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

答案 1 :(得分:4)

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

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

仅存储散列而不是完整密码是个好主意!

答案 2 :(得分:1)

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

但是您可以考虑仅存储密码的哈希值并迭代至少1000次。哈希不能回溯到原始密码。

另一个想法:是否可以选择将实施工作留给谁将使用您的源并使加密抽象?当然,如果您提供要下载的构建包,则不起作用。但话又说回来:在构建中你可以使用你自己的“秘密”加密,而stull在源代码中抽象它。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

Yuo可以使用babushka娃娃加密。您使用另一个密码加密密码,然后使用另一个密码对其进行加密,并多次执行此操作,最后以明文形式写入最后一个密码。任何想要访问orignal密码的人都会厌倦所有未加密的密码并在他们获得原始密码之前放弃。