从 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;
    }

我不得不更改为同步网络客户端

     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,但这并不能使其更安全。唯一的区别是,在第二种(Web客户端)情况下,Web客户端将首先在没有凭据的情况下发出请求。然后它将获得 401 未经授权的响应,之后它将使用完全相同的 Authorization Basic <base64_here> 标头发出第二个请求,因此它比立即应用该标头的效率要低。但同样,这两种情况都发送完全相同的授权标头。如前所述 - 如果您向https端点发出请求,您的凭据应该可以安全地防止第三方拦截,如果您已经在使用加密通道,则无需实现自己的加密。

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

相关内容

  • 没有找到相关文章

最新更新