我正在编写一个开源的 C# 应用程序,我需要能够存储每个用户保存的登录信息。 通常我只会加密密码,然后将其存储在用户设置文件中,但我担心由于代码是开源的,它有点破坏了加密的意义。因为任何人所要做的就是查看代码并获取加密密钥。
当然,这至少比以纯文本形式存储密码要困难得多。 但是有没有什么好的方法可以加密密码,但即使你有源代码,解密它至少仍然非常困难?也许做到这样至少会接近 除了加密的计算机之外,无法在任何计算机上解密?
编辑:澄清...我正在存储客户端密码,而不是用于验证其服务登录的密码。 它是我无法控制的现有 Web 服务的客户端。我只想在本地存储密码以便自动登录......就像任何聊天客户端一样。
编辑2: 非常抱歉之前没有说清楚。 但在某些时候必须以明文形式检索密码,而哈希不是一种选择:(即使该服务让我传递密码哈希,这也会有点违背目的,因为哈希与密码一样好:P
你问的基本上是不可能的。
如果需要解密,没有方法可以将密码安全地存储在客户端计算机上。由于您需要它来连接到服务(我认为该服务不支持 SSL),这一事实进一步加剧了这一情况。在这种情况下,人们可以使用网络分析仪轻松找到密码。
我玩的一款游戏(当然是闭源的)需要登录,密码保存在某处,但使用每次安装时唯一的密钥进行加密。我忘记了一次密码,所以我只使用了 Wireshark,瞧 - 我可以看到纯密码。这也让我想起人们抱怨在
Google Chrome 中很容易泄露密码......他们显然不知道更多。您可以尝试所有您想要的巧妙技巧,但是一旦有人访问了计算机,任何应用程序安全性都会被抛到九霄云外。
考虑到这一点,我会让加密和解密变得非常简单。最好的情况是,您可以创建一个从“机器独有的”东西派生的密钥,因此窃取加密密码的人将无法在没有访问所述唯一密钥的情况下解密它。如果您在 Windows 中使用此应用程序,您可以使用 DPAPI 代表用户存储敏感数据。
我认为,如果您使用 Rijndal 并创建随机盐值并从机器特定的事物(如某些硬件 ID)派生密钥,即使您知道它是如何工作的,也将很难解密,因为您缺少硬件。
还有另一个想法:
是否可以选择将实现留给使用您的源代码并使加密抽象的人?如果您提供内置捆绑包下载,当然不起作用。但话又说回来:在构建中,您可以使用自己的“秘密”加密,并仍然在源代码中抽象它。也许您可以使用某些机器特定值(例如 mac 或 sth)来加密密码。如果有人获得源代码和加密密码,但没有完全访问机器密码,则应该是安全的。
Yuo 可以使用 babushka 娃娃加密。您使用另一个密码加密该密码,然后使用另一个密码对其进行加密,如此反复多次,最终以明文形式写入最后一个密码。任何想要访问原始密码的人都会厌倦所有的解密并在获得原始密码之前放弃。