在http请求中加密登录凭据的正确方法是什么?

Joh*_*ith 1 .net c# security credentials httprequest

如果我需要对需要登录凭据的站点进行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());
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

以下代码是更好的替代方案,还是使用"基本"授权标头发出http请求?

        WebClient wc = new WebClient();
        wc.Credentials = new NetworkCredential(username, password);
        DoSomething(wc.DownloadString("https://..."));
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*rty 7

如果您使用HTTPS向服务器发出webrequest,则包括标头在内的整个邮件都会被加密.因此,您基本上无需担心加密数据.如果您打开Wireshark并尝试嗅探数据包,您会发现它们不可读.

.NET Framework将根据您发送请求的URL来处理引擎盖下所需的SSL加密.

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