HTTP認證基礎(chǔ)

基礎(chǔ)認證(Basic)


說直白點,認證就是讓訪問服務(wù)的人提供用戶名和密碼萍摊,然后對用戶名和密碼做校驗挤茄。

http的質(zhì)詢/響應(yīng)認證框架


客戶端和服務(wù)器的質(zhì)詢/響應(yīng)認證過程:

  • 客戶端發(fā)送請求;
  • 服務(wù)器收到請求后冰木,判斷如果請求的資源需要認證穷劈,則返回401狀態(tài),并在response headers中加入WWW-Authenticate頭部踊沸,要求客戶端帶上認證信息以后再發(fā)一次請求歇终;
  • 客戶端收到401返回信息后,重新向服務(wù)器發(fā)送請求逼龟,并在request headers中加入Authoriaztion頭部评凝,用來說明認證的用戶名、密碼腺律、算法等信息奕短;
  • 服務(wù)器再次收到請求后宜肉,判斷認證信息無誤,返回200翎碑,并在response headers中加入Authorization-Info頭部崖飘。

借用http權(quán)威指南中一圖來說明認證過程:

安全域


服務(wù)器第一次返回中WWW-Authenticate頭部中包含realm參數(shù),作用為標(biāo)識訪問資源的安全域杈女。服務(wù)器對不同數(shù)據(jù)區(qū)域可以設(shè)置不同的訪問權(quán)限,安全域字段的作用相當(dāng)于告訴客戶端要訪問的資源屬于服務(wù)器眾多區(qū)域中的那一片區(qū)域里吊圾。

基礎(chǔ)認證


WWW-Authenticate頭部中的Basic指的就是基礎(chǔ)認證(另外一個Digest指的是另一種認證方式:摘要認證达椰,詳見后文)。

Basic Auth超級簡單项乒,客戶端在輸入用戶名密碼后發(fā)送請求啰劲,瀏覽器會用一個冒號“:”將用戶名和密碼連接起來,然后做一下Base64編碼(關(guān)于Base64說明詳見http://blog.sina.com.cn/s/blog_87bd61ee0102wwfy.html)檀何,就直接把這個編碼后的字符串放到Authorization頭部里發(fā)給服務(wù)器了蝇裤。

代理認證


服務(wù)器可以委托代理服務(wù)器提供對內(nèi)部資源的統(tǒng)一訪問控制,即代理認證频鉴。

代理認證的步驟與服務(wù)器認證相同栓辜。但首部的狀態(tài)碼有所不同。

摘要認證(Digest)


摘要認證利用摘要算法(如MD5)對重要數(shù)據(jù)做不可逆編碼垛孔,來防止惡意截獲信息后獲取敏感內(nèi)容藕甩。

摘要認證的握手機制


客戶端和服務(wù)器的質(zhì)詢/響應(yīng)認證過程:

  • 客戶端發(fā)送請求;
  • 服務(wù)器收到請求后會生成一個隨機數(shù)nonce(見下文隨機數(shù)選擇)放在WWW-Authenticate頭部周荐,返回401狀態(tài)狭莱。如果要求增強保護質(zhì)量(QoP,可對實體主體做完整性校驗)概作,則將支持的QoP屬性也放在WWW-Authenticate頭部腋妙。
  • 客戶端選擇一個算法(auth或者auth-int),計算出密碼和其他數(shù)據(jù)的摘要讯榕,將摘要(response)和算法(qop)放在Authorization頭部中骤素。如果客戶端還要對服務(wù)器進行認證,則生成客戶端隨機數(shù)(cnonce)愚屁、隨機數(shù)生成次數(shù)(nc)也放在Authorization中發(fā)送服務(wù)器谆甜。
  • 服務(wù)器收到算法及支撐數(shù)據(jù)(請求方法、請求uri集绰、服務(wù)器隨機數(shù)等)规辱,計算出摘要,與客戶端摘要進行比較栽燕,驗證是否匹配罕袋。另外如果客戶端發(fā)送cnonce改淑,服務(wù)器會再生成一個隨機數(shù)(nextnonce)出來,然后根據(jù)nextnonce浴讯、cnonce朵夏、實體主體等等生成應(yīng)答摘要(rspauth),加到Authorization-Info頭部中榆纽,返回客戶端仰猖。
  • 客戶端收到返回后,再算出摘要奈籽,與服務(wù)器返回的rspauth比較饥侵,驗證是否匹配。后如果還要發(fā)送請求衣屏,重復(fù)3躏升、4、5步驟狼忱。

摘要算法


(1)算法基礎(chǔ):

  • H(v1) = MD5(v1); 將v1進行MD5編碼
  • KD(v1, v2) = MD5(v1 : v2); 將v1和v2用冒號”:”連接后進行MD5編碼
  • A1表示包含安全信息的數(shù)據(jù)塊膨疏,A1=(user):(realm):(password);
  • QoP(保護質(zhì)量)钻弄,對不包含安全信息的數(shù)據(jù)設(shè)置保護方式佃却,可選項:auth、auth-int
  • A2表示不包含安全信息的數(shù)據(jù)塊窘俺,根據(jù)qop值確定:

a) QoP=auth或undefined時双霍,A2=(request-method) : (uri-directive-value)

b) QoP=auth-int時,A2=(request-method) : (uri-directive-value) : H((entity-body))

(2)老摘要算法

兼容RFC2069,在沒有qop選項時使用批销。

算法:(以MD5算法為例)

KD(H(A1), (nonce) : H(A2))
= MD5(MD5(A1) : (nonce) : MD5(A2))
= MD5(MD5((user) : (realm) : (password)) : (nonce) : MD5((request-method) : (uri-directive-value)))

(3)新摘要算法

新摘要算法為推薦方式洒闸,包含了對隨機數(shù)計算和對稱認證的支持。只要qop為auth或auth-int均芽,就要使用這種方式丘逸。

算法:(以MD5算法,qop=auth-int為例)

KD(H(A1), (nonce) : (nc) : (cnonce) : (qop) : H(A2))
= MD5(MD5(A1) : (nonce) : (nc) : (cnonce) : (qop) : MD5(A2))
= MD5(MD5((user) : (realm) : (password)) : (nonce) : (nc) : (cnonce) : (qop) : MD5((request-method) : (uri-directive-value) : MD5((entity-body))))

例如掀宋,服務(wù)器response如下:

 Authorization: Digest
 username=”hu”
 realm=”home”
 nonce=”1” //服務(wù)器端的隨機數(shù)一起帶回
 uri=”/login” //必須跟請求行一致
 qop=”auth-int” //保護質(zhì)量參數(shù)
 nc=0000001//nonce-count隨機數(shù)計數(shù)
 cnonce=”3” //客戶端隨機數(shù)深纲,用于對稱校驗
 response=”XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”//最終摘要

response計算公式為 :

 MD5(MD5(hu:home:(password)):1:0000001:3:auth:MD5(login:MD5(body)))

http權(quán)威指南中似乎未對nc做說明,引用RFC2831中的一段說明:

The nc-value is the hexadecimal count of the number of requests (including the current request) that the client has sent with the nonce value in this request. For example, in the first request sent in response to a given nonce value, the client sends "nc=00000001". The purpose of this directive is to allow the server to detect request replays by maintaining its own copy of this count - if the same nc-value is seen twice, then the request is a replay...

試著翻譯下:

nc-value指的是客戶端向服務(wù)器端發(fā)送帶有隨機數(shù)的請求次數(shù)(包含本次請求)的十六進制數(shù)(補充:八位十六進制數(shù))劲妙。例如湃鹊,當(dāng)?shù)谝淮伟l(fā)送帶有隨機數(shù)的請求時,客戶端發(fā)送”nc=00000001”镣奋。其目的是讓服務(wù)器能夠通過維護請求次數(shù)币呵,檢測到重復(fù)請求-如果相同的nc-value出現(xiàn)在兩次請求中,那么這兩次請求即為重復(fù)請求...
參考:https://www.ietf.org/rfc/rfc2... 搜索nonce-count

(4)機數(shù)選擇

RFC2617建議采用的隨機數(shù)公式:

Base64(time-stamp H(time-stamp : ETag : private-key))

以服務(wù)器端為例:time-stamp為服務(wù)器響應(yīng)請求的時間侨颈;ETag為請求實體有關(guān)的Http ETag首部(詳見瀏覽器緩存之協(xié)商緩存ETag)余赢;private-key是只有服務(wù)器知道的字符串芯义。保證不同請求時間,不同文件妻柒,產(chǎn)生不同隨機數(shù)扛拨。

(5)對稱認證

在客戶端接收到服務(wù)器端發(fā)回401響應(yīng)后,可以在發(fā)送授權(quán)請求的Authorization header中加上客戶端隨機數(shù)举塔,這就要求服務(wù)器端再收到第二次請求時绑警,將客戶端隨機數(shù)加入算法。

(6)請求摘要 & 響應(yīng)摘要

響應(yīng)摘要的計算方式與請求摘要類似央渣,但響應(yīng)中沒有方法计盒,報文實體數(shù)據(jù)也不同,這些信息影響A2的計算結(jié)果:

請求摘要(QoP=auth-int):A2=(request-method) : (uri-directive-value) : H((request-entity-body))

響應(yīng)摘要(QoP=auth-int):A2=:(uri-directive-value) : H((response-entity-body))

轉(zhuǎn)自https://segmentfault.com/a/1190000006672893

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痹屹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枉氮,更是在濱河造成了極大的恐慌志衍,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聊替,死亡現(xiàn)場離奇詭異楼肪,居然都是意外死亡,警方通過查閱死者的電腦和手機惹悄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門春叫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泣港,你說我怎么就攤上這事暂殖。” “怎么了当纱?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵呛每,是天一觀的道長。 經(jīng)常有香客問我坡氯,道長晨横,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任箫柳,我火速辦了婚禮手形,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悯恍。我一直安慰自己库糠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布涮毫。 她就那樣靜靜地躺著曼玩,像睡著了一般鳞骤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黍判,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天豫尽,我揣著相機與錄音,去河邊找鬼顷帖。 笑死美旧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贬墩。 我是一名探鬼主播榴嗅,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陶舞!你這毒婦竟也來了嗽测?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肿孵,失蹤者是張志新(化名)和其女友劉穎唠粥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體停做,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡晤愧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛉腌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官份。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烙丛,靈堂內(nèi)的尸體忽然破棺而出舅巷,到底是詐尸還是另有隱情,我是刑警寧澤河咽,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布悄谐,位于F島的核電站,受9級特大地震影響库北,放射性物質(zhì)發(fā)生泄漏爬舰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一寒瓦、第九天 我趴在偏房一處隱蔽的房頂上張望情屹。 院中可真熱鬧,春花似錦杂腰、人聲如沸垃你。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惜颇。三九已至皆刺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凌摄,已是汗流浹背羡蛾。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锨亏,地道東北人痴怨。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像器予,于是被迫代替她去往敵國和親浪藻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一乾翔、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,333評論 6 152
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理爱葵,服務(wù)發(fā)現(xiàn),斷路器反浓,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 工作流程 一次HTTP操作稱為一個事務(wù)萌丈,其工作過程可分為四步: 1)首先客戶機與服務(wù)器需要建立連接。只要單擊某個超...
    保川閱讀 4,587評論 2 14
  • Http協(xié)議詳解 標(biāo)簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)勾习,內(nèi)容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,210評論 3 82
  • 我從未睜眼看過 讓你魂牽夢縈的海棠花 你天真的臉 映襯著詩意 而我浓瞪,我 放不下的是那朵紅蓮 我歷一路悲歡 卻聽聞海...
    風(fēng)晚歌閱讀 814評論 0 0