2

如果我需要向需要登录凭据的站点发出 HttpRequest,我可以使用类似于以下的代码,但正如您所见,用户名和密码只是 base64 编码,这意味着如果有人要拦截所有 http 请求他们要做的是搜索与“授权”标头关联的值,并且他们有我的登录信息。

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://...");

        request.Headers.Add("Authorization",
        string.Format("Basic {0}", Convert.ToBase64String(Encoding.Default.GetBytes(
        string.Format("{0}:{1}", username, password)))));

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            using (Stream s = response.GetResponseStream())
            {
                using (StreamReader r = new StreamReader(s))
                {
                    DoSomething(r.ReadToEnd());
                }
            }
        }

下面的代码是更好的选择,还是它也使用“基本”授权标头发出 http 请求?

        WebClient wc = new WebClient();
        wc.Credentials = new NetworkCredential(username, password);
        DoSomething(wc.DownloadString("https://..."));

如果两个代码都没有导致“隐藏”登录凭据的 http 请求,并且实际上有一种方法可以“隐藏”它们,那么正确的方法是什么?

4

3 回答 3

8

如果您使用 HTTPS 向服务器发出 Web 请求,您的整个消息(包括标头)都会被加密。因此,您基本上无需担心加密数据。如果您打开 Wireshark 并尝试嗅探数据包,您会发现它们不可读。

.NET Framework 将根据您发送请求的 URL 处理底层所需的 SSL 加密。

更多信息可以在 MSDN 上找到:http: //msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

于 2013-01-30T17:12:31.247 回答
1

这两个都将使用 HTTP 基本访问身份验证,但由于您似乎使用的是 HTTPS,因此您不必担心这一点,因为无论如何整个请求都会被加密。

于 2013-01-30T17:14:54.843 回答
0

我建议使用 WebClient 而不考虑它是加密的一部分,我只是认为它是一种更清洁的方法,如果你真的关心登录凭据,你可以使用

SecureString testString = new SecureString(); 

http://blogs.msdn.com/b/fpintos/archive/2009/06/12/how-to-properly-convert-securestring-to-string.aspx

;

于 2013-01-30T17:22:16.657 回答