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();

        }
    }
}

  

相關文章
相關標籤/搜索