C#如何在应用程序中存储密码

C#如何在应用程序中存储密码,c#,security,C#,Security,我正在尝试编写一个应用程序,计划每小时从Sharepoint服务器自动下载一个页面。它是一个xml文件。到目前为止,一切正常,除了我不喜欢在我的应用程序中以明文形式存储连接Sharepoint所需的密码。此处的示例代码: WebClient client = new WebClient(); String username = "myusername"; String password = "mypassword" String filename = "C:\\Temp\\" + DateTim

我正在尝试编写一个应用程序,计划每小时从Sharepoint服务器自动下载一个页面。它是一个xml文件。到目前为止,一切正常,除了我不喜欢在我的应用程序中以明文形式存储连接Sharepoint所需的密码。此处的示例代码:

WebClient client = new WebClient();
String username = "myusername";
String password = "mypassword"
String filename = "C:\\Temp\\" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".xml";

client.Credentials = new System.Net.NetworkCredential(username, password);
string credentials =  Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
client.DownloadFile("myurl", filename);
如果有人从我的服务器获取了executabe文件并对其进行了反汇编(例如使用Reflector),有没有办法使我的密码更难读取
我发现:
但我并没有真正弄明白如何在我的应用程序中使用它。

事实上,你最好不要使用密码。如果服务在正确的凭据下运行,则可以通过以下方式使用该凭据:

因此,在您的示例中:

client.Credentials = CredentialCache.DefaultNetworkCredentials;

这将为您获取当前网络用户的凭据,如
DOMAIN\user

如果您必须在应用程序中存储密码,请将其放入配置文件中,然后使用该配置文件对相应部分进行加密。

@O.R.Mapper,我完全不同意。我认为这个问题没有什么是无限的。他提出了自己的问题和代码。考虑到这是他的第一个问题,我认为他做得很好。你的评论为新用户创造了一个不受欢迎的环境。你的链接有点混乱。。。读一读这里的例子@JamesHill:很抱歉我给人留下了这样的印象,特别是在我回答这里的问题之前,我读了很多关于所谓的不受欢迎的言论。因此,我认为我已经付出了额外的努力,以确保该网站不会显得不受欢迎。我以友好的语气回应,而不是说“你做得都不对”,我准确地指出了我认为可以改进的地方,我提供了一个链接,指向我认为OP可以更好地解决他们的问题的地方,我没有投反对票,我没有结束投票,我指出我认为这个问题不适合这里。@O.R.Mapper:我认为你的建议在语气和内容上都很好(尽管我不同意开放式部分)。R.Mapper:你的帖子上没有不友好的地方。谢谢你的建设性意见,下次我会尽量让我的问题更合适。我不认为哈希在这种情况下会有帮助,因为密码实际上必须用于执行操作,而不是与用户输入进行比较。是的,用户将无法看到密码,但应用程序也无法使用密码,这就是为什么它被存储在第一位。不,应用程序无法破译它。散列是单向的。数据需要加密,以便解密。没有去灰化,这是散列有用的主要原因之一。@Patrick Hofman:这正是关键所在。我使用了您的代码,并计划以有权访问Sharepoint服务器的用户身份运行应用程序。它是有效的。非常感谢。这是否仅用于web.config?这个问题最初是针对winforms的,但似乎在编辑中被删除了。我认为它是为ASP.NET应用程序创建的,但它可以用于任何配置文件,例如。该代码是VB,但演示了原理。