我正处于将与Web服务通信的.NET桌面应用程序的规划阶段。 Web服务需要用户名和密码,此类应用程序中的一个常见功能是保存用户下次登录的凭据(只需一个简单的“自动登录”复选框)。
我想到了实现这一目标的几种方法,但我不确定最安全的方式是什么。它是否应该加密存储在一个文件中(并且可能有人恶意将该文件复制到他们自己的机器上并因此以原始人身份登录),或者在注册表中以某种方式(我以前没有做任何注册工作,是否安全并且会这行得通)?还有其他我可能没有想过的选择吗?
(编辑澄清:该应用程序将在互联网上提供,因此用户将在他们自己的机器上运行 - 虽然我知道在安全性方面存在一定的截止点,因为我不能坚持使用防火墙和反恶意软件程序,我想让某人获得未经授权的访问至少有点困难。)
答案 0 :(得分:3)
Windows可以安全地存储用户凭据。我发现这篇文章是最好的:http://blogs.msdn.com/peerchan/pages/487834.aspx
答案 1 :(得分:1)
我asked(以及随后answered)一段时间以前的一个非常相似的问题。这样做的预期方法是使用ProtectedData类,其中包括添加基于当前用户加密的附加项的选项。
byte[] dataToEncrypt = new byte[] { ... };
// entropy will be combined with current user credentials
byte[] additionalEntropy = new byte { 0x1, 0x2, 0x3, 0x4 };
byte[] encryptedData = ProtectedData.Protect(
dataToEncrypt, additionalEntropy, DataProtectionScope.CurrentUser);
byte[] decryptedData = ProtectedData.Unprotect(
encryptedData, additionalEntropy, DataProtectionScope.CurrentUser);
答案 2 :(得分:0)
我无法想象为什么有人试图找到密码,当他或她可以登录而不输入密码时(因为你自动完成密码)。我弄错了?
顺便说一下,请确保使用https进行通信。
答案 3 :(得分:0)
加密将是最佳选择。我使用内部使用的应用程序做了同样的事情,该应用程序在XML文件中加密了用户名和密码。
对于想要将文件复制到另一台计算机上的人,您可以执行诸如连接计算机名称和IP地址(以及相对唯一标识计算机的任何其他属性)之类的操作,并将该字符串加密为已保存凭证文件的一部分。
然后,当您的应用程序重新读取该文件以处理登录时,如果它对运行的机器名称/ IP地址/等执行相同的加密,但会为存储在文件中的那个提供不同的哈希值,您的应用程序将知道该文件已被复制到其他计算机,它可以将其丢弃,并提示登录详细信息。
答案 4 :(得分:0)
如果您可以存储凭据并稍后检索它们,则其他人也可以检索凭据。
如果您仍然希望能够记住凭据,我建议将其存储在用户可以携带的USB记忆棒上。通过这种方式,如果计算机是,则不会破坏凭证。 (除非USB记忆棒当时已连接到计算机)。
答案 5 :(得分:0)
客户端软件没有外部加载数据的问题(例如:解密文件的密码)容易受到攻击。
您可以尝试做的是使用RSA密钥对对信息进行加密,密钥由当前加载的用户配置文件所特有的数据组成(只能在同一台计算机上使用相同的用户配置文件轻松获取)并将哈希存储在注册表中。
在这种情况下,注册表就像是一个文件,只是你可以尝试让使用它的用户不那么透明。