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

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

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

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

编辑2:完全对不起之前不清楚。 但是密码必须在某些时候以明文检索并且哈希不是一个选项:(即使服务会让我传递密码哈希,这有点打败了目的,因为哈希会像密码一样好:P

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

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

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

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

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

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

如何:使用DPAPI加密和解密数据(C#/ VB.NET)

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

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

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

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

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

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