2010-03-16 68 views
3

我正处于.NET桌面应用程序的计划阶段,该应用程序将与Web服务进行通信。 Web服务需要一个用户名和密码,这种应用程序的一个共同特点是保存下一次登录的用户凭据(只是一个简单的“自动登录”复选框)。.NET桌面应用程序记住登录到webservice

我想到了实现这一点的几种方法,但我不确定最安全的方式是什么。如果它被加密存储在一个文件中(并且可能有人邪恶地将该文件复制到他们自己的机器上并因此以原始人身份登录),或以某种方式在注册表中注册(我之前没有做过任何注册表工作,它是否安全并且会这行得通)?有没有其他的选择我可能没有想到?

(编辑澄清:应用程序将在互联网上提供,所以用户将在自己的机器上运行这个程序 - 虽然我知道在安全性方面存在一定的临界点,因为我不能坚持人们使用防火墙和反恶意软件程序,我想使它至少有点难以让某人获得未经授权的访问。)

回答

0

我无法想象为什么有人会尝试查找密码,当他或她可以登录而无需输入密码(因为你自动完成它)。我错了吗?

顺便说一句,请确保您使用https进行通信。

+0

“窃取”文件的人可能无法物理访问机器来运行应用程序,但可以通过某种后门或特洛伊木马访问文件。我可以想象它发生在我们的IT部门(谁可以远程访问远程PC的文件/文件夹,但无法物理访问键盘/鼠标等) – 2010-03-16 12:48:27

+0

感谢您的提示!不过,我发现共享程序文件(如果您将应用程序加密数据存储在那里)是一种不好的方法。 – thelost 2010-03-16 12:57:31

+0

您不必分享您的程序文件以“被盗” - 认为木马,后门病毒,甚至cookie都可能被盗用(网站中的XSS)。在我们的IT部门用户不知道我们有完全访问他们的机器文件(当然,为了排除故障)。另外,用户可能甚至不知道应用程序已经在文件中加密了他们的密码,他们只是想“哦,它记住了我的密码”。 – 2010-03-16 16:23:28

0

加密是要走的路。我对内部使用的应用程序做了同样的事情,该应用程序在XML文件中加密了用户名和密码。

对于想要将文件复制到另一台机器的人,可以执行诸如连接机器名称和IP地址(以及任何其他相对唯一标识机器的属性)并将该字符串作为已保存凭证文件的一部分加密。

然后,当你的应用程序重新读取该文件来处理登录,如果它执行相同的机器名称/ IP地址/ etc加密它正在运行,但提出了一个不同的哈希存储在文件,您的应用程序会知道该文件已被复制到不同的机器,它可以放弃它,并提示输入登录详细信息。

+0

当你得到一个新的IP地址时,应用程序重新向你索要密码不是很奇怪吗?或者如果机器名称改变了? – mlsteeves 2010-03-16 16:10:19

+0

不,不是真的。你的机器名称改变多少次?或IP地址?在我最后一个5年的时间里,我的IP地址没有改变,也没有改变我的机器名称。在家里,我的宽带IP地址每10天更换一次。我这样做的应用程序每天都会过期“保存凭据”文件,因此用户必须每天至少输入一次密码,这样他们就不会轻易忘记它们! – 2010-03-16 16:21:18

0

如果您可以存储凭据并稍后检索它们,则其他人也可以检索凭据。

如果您仍然想要记住凭据的功能,建议将它们存储在用户随身携带的USB记忆棒上。通过这种方式,如果计算机存在,证书不会受到威胁。 (除非USB棒当时连接到计算机)。

0

数据未从外部加载(例如:解密文件的密码)的客户端软件存在问题。

你可以尝试做的,是使用RSA密钥,密钥被包含的数据是唯一到他们当前加载的用户配置文件(只能使用同一台机器上相同的用户配置文件很容易地获得对信息进行加密)并将散列存储在注册表中。

在这种情况下,注册表就像是一个文件给你,只是你可以尝试使用它的用户不那么透明。

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);