HTTP基本认证

 

         众所周知,Web令人们能够很方便的访问分布在世界各个角落里信息。可是仅仅是方便仍是不够的,并非全部的信息都适合在互联网上公开访问,咱们须要保证只有特定的人才能看到咱们的敏感信息而且执行特定的操做。算法

         服务器须要经过某种方式了解访问用户的身份。一旦服务器知道了用户身份,就能够判断用户能够访问的事务和资源了。认证意味着要证实客户端访问用户是谁。一般状况是经过提供用户名和密码来认证的。HTTP为咱们提供了一些原生的工具。今天咱们来看下基本认证。安全

HTTP质询/响应认证框架

         HTTP提供了一个原生的质询/响应框架,简化了对用户的认证过程。HTTP的认证模型如图所示。服务器

         Web服务器接收到一条HTTP请求报文时,服务器没有直接响应请求的资源,而是以一个“认证质询”进行响应,要求用户提供一些保密信息来讲明其身份。用户再次发起请求时,要附上保密证书(用户名和密码)。若是与要求的不匹配,服务器能够再次质询客户端,或者产生一条错误信息。若是证书匹配则返回请求的资源。网络

 

 

认证协议与首部

  1. HTTP提供可定制的控制首部,为不一样的认证协议提供了一个可扩展框架。
  2. HTTP提供了两个认证协议:基本认证和摘要认证。

 

 

基本认证明例框架

  1. 客户端请求某资源。
  2. 服务器对用户进行质询时,会返回一条401Unauthorized响应,并在WWW-Authenticate首部中说明可使用的认证方式。
  3. 客户端从新发送请求,并在Authorization首部附加上用户名、密码等其余一些认证参数。
  4. 受权成功完成后,服务器会返回一个正常的状态码(好比,200  OK),对于高级算法来讲,可能还会在Authentication-Info首部附加额外的信息。

 

HTTP基本认证将用户名和密码打包在一块儿,并使用base-64编码方式对其进行编码。具体过程以下图所示。工具

 

基本认证的安全缺陷

  1. 基本认证经过网络发送用户名和密码,虽然进行base-64编码能够隐藏用户名和密码,可是很容易经过反向编码过程进行解码。
  2. 即便密码以更加难以解码的方式加密,第三方用户仍然能够捕获被修改过的用户名和密码,并经过重放攻击获取服务器的访问权限。
  3. 不少用户会将不一样的服务使用相同的用户名和密码,基本认证直接发送用户名和密码,会对一些重要的服务(好比在线银行网站)形成威胁。
  4. 基本认证没有提供任何针对代理和中间人节点的防御措施,他们没有修改认证首部,但却修改了报文的其他部分,这样就严重的改变了事务的本质。
  5. 假冒服务器很容易骗过基本认证。若是在用户实际连接到一台恶意服务器或者网关的时候,可以让用户相信他连接的是一个受基本认证保护的合法主机,攻击者就能够请求用户输入密码。
  6. IIS中站点默认开启匿名身份验证,并能够直接访问。

基本认证明例 

  1. IIS中站点默认开启匿名身份验证,并能够直接访问

 

 

      2. 关闭匿名认证,开启基本认证方式,直接访问须要输入用户名密码网站

      3.客户端模拟基本认证过程编码

         控制台模拟代码以下加密

         

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication_HttpSec
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri("HTTP://Localhost"));
            request.Method = "Get";

            WebResponse response = null;
            try
            {
                response = request.GetResponse();
            }
            catch (WebException ex)
            {
                Console.WriteLine("访问发生异常,异常信息以下:"+ ex.Message);
                Console.WriteLine("异常信息返回的质询响应头为:");
                foreach (string key in ex.Response.Headers.Keys)
                {
                    Console.WriteLine("     "+ key +":"+ex.Response.Headers[key]);
                }

                Console.WriteLine("添加Authorization认证头部并从新发送请求");
                HttpWebRequest request2 = (HttpWebRequest)HttpWebRequest.Create(new Uri("HTTP://Localhost"));
                request2.Method = "Get";
                request2.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes("administrator:P@ssword")));
                try
                {
                    response = request2.GetResponse();
                }
                catch (WebException ex2)
                {
                    Console.WriteLine("添加Authorization认证头部并从新发送请求发生异常:"+ex2.Message);
                    Console.Read();
                    return;
                }
                Stream stream =  response.GetResponseStream();
                System.IO.StreamReader reader = new StreamReader(stream);
                string content = reader.ReadToEnd();
                Console.WriteLine("请求响应的内容以下");
                Console.WriteLine(content);
            }

            Console.Read();

        }
    }
}

  

相关文章
相关标签/搜索