从HttpClient更改为Webclient,以纯文本形式发送密码

时间:2017-10-09 19:53:41

标签: c# httpclient webclient

我有一个使用HttpClient的异步方法:

 private static HttpClient client = new HttpClient();   //As pointed by @maccettura
 private async Task<string> GetResult(Uri url, string user, string pass)
 {

    var PassArray = new UTF8Encoding().GetBytes(user + ":" + pass);

        client.BaseAddress = url;

        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(_passArray));

        string result;

        using (HttpResponseMessage response = await client.GetAsync(url))
        using (HttpContent content = response.Content)
        {
            result = await content.ReadAsStringAsync();
        }
        return result;
    }

我必须更改为同步WebClient

     private string GetResult(Uri url, string user, string pass)
    {
        using (var client = new WebClient())
        {
            client.UseDefaultCredentials = true;
            client.Credentials = new NetworkCredential(user, pass);
            using (var stream = client.OpenRead(url))
            using (var streamReader = new StreamReader(stream, Encoding.UTF8, true))
            {
                return streamReader.ReadToEnd();
            }
        }
    }

我是否通过发送普通用户名和密码来破坏安全性?如果是这样,有没有办法增加安全性? (网址是Https地址)

2 个答案:

答案 0 :(得分:1)

在这两种情况下,您都会以“纯文本”发送凭据。在这两种情况下,它们在发送之前都会转换为base-64,但这并不会使它更安全。唯一的区别是在第二个(WebClient)案例中,Web客户端将首先发出没有凭据的请求。然后它将获得401 Unauthorized响应,之后它将使用完全相同的Authorization Basic <base64_here>标头发出第二个请求,因此它比立即应用该标头效率低。但是两种情况都会发送完全相同的Authorization标头。如前所述 - 如果您向https端点发出请求,您的凭据应该可以安全地防止第三方拦截,如果您已经使用加密通道,则无需实施自己的加密。

答案 1 :(得分:0)

是的,您通过发送纯文本用户名和密码来妥协。可以有网络嗅探器,可以获取您通过http发送的包并读取它们。如果用户名和密码是普通的那么呃哦。嗅探者通常会在图书馆和咖啡馆等公共场所嗅闻。

相关问题