【问题标题】:Changing from HttpClient to Webclient, sending password as plain text从 HttpClient 更改为 Webclient,以纯文本形式发送密码
【发布时间】:2017-10-09 19:53:40
【问题描述】:

我有一个使用 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();
            }
        }
    }

发送普通用户名和密码是否会损害安全性?如果是这样,有没有办法提高安全性? (url是一个Https地址)

【问题讨论】:

  • @maccettura 哦……很有趣。谢谢!
  • 是 HTTPS 的使用,而不是您使用的保护凭证的库。 Base64 编码无论如何都不是任何保护。
  • 好的,很高兴知道 - 网址受 HTTPS 保护,

标签: c# httpclient webclient


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你是对的,但它与 WebClient 与 HttpClient 无关。
    • 解决方案是你提到的使用秘密和算法加密使用你的秘密然后在你收到时解密。
    • @sdfbhg,如果另一端不是您的站点,那么您不能这样做。答案是确保使用 HTTPS。
    • 您能否与其他网站核实是否已实施安全措施。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2017-01-27
    • 2015-12-20
    • 1970-01-01
    • 2021-10-09
    • 2015-09-19
    • 2016-03-07
    相关资源
    最近更新 更多