2017-10-09 77 views
1

我有一个使用HttpClient的异步方法:从HttpClient的更改为Web客户端,发送密码以纯文本

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地址)

+0

仅供参考,[您正在使用HttpClient错误](https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/)。 – maccettura

+0

@maccettura Oooo ...有趣。谢谢! – Yasskier

+0

这是使用HTTPS,而不是您使用的保护凭据的库。无论如何,Base64编码不是任何保护。 – Crowcoder

回答

0

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

+0

您的解决方案将是....? – Yasskier

+0

你是对的,但它与WebClient vs HttpClient无关。 – Crowcoder

+0

解决方法就是你提到的秘密和算法使用你的秘密进行加密,然后解密当你收到。 – sdfbhg

1

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