从HttpClient的更改为Web客户端,发送密码以纯文本
问题描述:
我有一个使用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地址)
答
在这两种情况下,您都以“纯文本”发送凭证。在这两种情况下,它们在发送之前都转换为base-64,但这不会使它更安全。唯一的区别是,在第二个(WebClient)案例中,Web客户端将首先发出请求而没有凭证。然后,它会得到401未经授权的响应,之后它将发出第二个请求,其标题与Authorization Basic <base64_here>
标题完全相同,因此比立即应用该标题的效率要低。但是,两种情况都发送完全相同的授权标头。如前所述 - 如果您向https端点发出请求,则您的凭据应安全无虞,不受第三方拦截,如果您已使用加密通道,则无需实施自己的加密。
仅供参考,[您正在使用HttpClient错误](https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/)。 – maccettura
@maccettura Oooo ...有趣。谢谢! – Yasskier
这是使用HTTPS,而不是您使用的保护凭据的库。无论如何,Base64编码不是任何保护。 – Crowcoder