我有一个使用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地址)
答案 0 :(得分:1)
在这两种情况下,您都会以“纯文本”发送凭据。在这两种情况下,它们在发送之前都会转换为base-64,但这并不会使它更安全。唯一的区别是在第二个(WebClient)案例中,Web客户端将首先发出没有凭据的请求。然后它将获得401 Unauthorized响应,之后它将使用完全相同的Authorization Basic <base64_here>
标头发出第二个请求,因此它比立即应用该标头效率低。但是两种情况都会发送完全相同的Authorization标头。如前所述 - 如果您向https端点发出请求,您的凭据应该可以安全地防止第三方拦截,如果您已经使用加密通道,则无需实施自己的加密。
答案 1 :(得分:0)
是的,您通过发送纯文本用户名和密码来妥协。可以有网络嗅探器,可以获取您通过http发送的包并读取它们。如果用户名和密码是普通的那么呃哦。嗅探者通常会在图书馆和咖啡馆等公共场所嗅闻。