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

C# 在开源应用程序中存储保存的密码,c#,encryption,passwords,C#,Encryption,Passwords,我正在编写一个开源的C#应用程序,我需要能够为每个用户存储保存的登录信息。通常我只会对密码进行加密,然后将其存储在用户设置文件中,但我担心,由于代码是开源的,因此无法对其进行加密。因为所有人都要做的就是查看代码并获取加密密钥 诚然,这至少比以纯文本形式存储密码要困难得多。但是,有没有什么好办法可以对密码进行加密,但即使你有密码的来源,也至少使解密变得极其困难?也许能让它至少接近 无法在任何计算机上解密,而不是在加密计算机上解密 编辑:澄清。。。我存储的是客户端密码,而不是验证其服务登录的密码。它

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

诚然,这至少比以纯文本形式存储密码要困难得多。但是,有没有什么好办法可以对密码进行加密,但即使你有密码的来源,也至少使解密变得极其困难?也许能让它至少接近 无法在任何计算机上解密,而不是在加密计算机上解密

编辑:澄清。。。我存储的是客户端密码,而不是验证其服务登录的密码。它是一个我无法控制的现有web服务的客户端。我只想在本地存储密码以便自动登录。。。就像任何聊天客户端一样


编辑2:非常抱歉之前没有弄清楚。但密码必须在某个时候以明文形式检索,哈希不是一个选项:(即使服务允许我传递密码散列,但这会有点违背目的,因为散列与密码一样好:P

我认为如果您使用Rijndal,创建随机salt值,并从特定于机器的东西(如一些硬件ID)派生密钥)它将很难解密,即使你知道它是如何工作的,因为你丢失了硬件的信息

但您可以考虑仅存储密码的散列,并至少重复1000次。哈希不能被重新绑定到原始密码。


还有另一个想法:将实现留给谁来使用您的源代码并使加密抽象化,这可能是一种选择吗?如果您提供一个可下载的内置包,这当然不起作用。但话说回来:在构建中,您可以使用自己的“秘密”加密和stull在源代码中具有抽象性。

也许您可以使用一些特定于机器的值来加密密码,如mac或其他。如果有人获得源代码和加密密码,但没有对机器密码的完全访问权限,则应该是安全的。

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


另外,只存储散列而不是完整密码也是一个好主意!

您所要求的基本上是不可能的

如果需要对密码进行解密,则没有方法可以安全地将密码存储在客户端计算机上。更糟糕的是,您需要将密码连接到服务,我认为服务不支持SSL。在这种情况下,您可以通过使用网络分析器轻松地找到密码

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

这也让我想起了人们抱怨很容易在……中泄露密码,他们显然不太清楚。你可以尝试所有你想要的聪明技巧,但是一旦有人访问了机器,任何应用程序安全都会被扔出窗外


因此,考虑到这一点,我会让加密和解密非常简单。最多,你可以创建一个从某个东西派生的密钥,这样窃取加密密码的人在没有访问该唯一密钥的情况下将无法解密。Yuo可以使用babushka玩偶加密。你用另一个密码加密密码,然后加密用另一个密码加密,并多次这样做,最终以明文形式写入最后一个密码。任何想要访问原始密码的人都会厌倦所有的未加密操作,并在获得原始密码之前放弃。

不要理解哈希的意思……我需要密码的实际明文因为它必须从我的客户机传递到服务(这是一个加密的连接)并且不能是散列。根据您收到的密码,只需再次计算散列,并将其与存储在数据库中的散列进行比较。如果它们匹配,则密码匹配。当然,如果您需要密码从服务器登录到其他地方,这对您没有帮助。他部分更改了问题,澄清了一点,投票否决确实有点不公平MAC值是不安全的。考虑一下计算机的MAC值是多么容易,你是对的,我仍然没有开源思想。无论如何,仍然是想得到机器特定的值。幸运的是,服务确实提供了SSL。而且,我知道,唯一完全安全的方法是让用户每次输入密码,但我认为大多数都是。愿意为此放弃一点安全性。因此,从服务器提供某种具有某种有效性的令牌…它不是防火的,但它尽可能好。请您也提一下我可以用来加密密码的算法吗?不确定我是否会丢分,因为您没有幽默感。