2012-12-01 19 views
4

爲什麼在Authorization頭文件中使用Base64編碼「username:password」的結果字符串字面值?它的背景是什麼?爲什麼在基本身份驗證中使用Base64

+2

相關:[HTTP基本身份驗證中的Base 64編碼](http://stackoverflow.com/questions/5597086/base-64-encoding-in-http-basic-auth)和[base 64的用途是什麼編碼和爲什麼它在HTTP基本認證中使用?](http://stackoverflow.com/questions/4070693/what-is-the-purpose-of-base-64-encoding-and-why-it-used-in- http-basic-authentica) –

回答

4

這是production rule for the userid-password元組它編碼之前:

userid-password = [ token ] ":" *TEXT 

這裏token規定如下:

token   = 1*<any CHAR except CTLs or tspecials> 

這基本上是any US-ASCII character的32至126,但沒有some special characters的範圍內((),<,>,@,,,;:\"/[]?={},空間,和水平標籤)。

TEXT被指定如下:

TEXT   = <any OCTET except CTLs, 
        but including LWS> 

這基本上是任何octet(0-255)序列除了control characters(碼點0-31,127),但including linear whitespace序列,其是一個或多個空格或可由CRLF序列前面水平製表符:

LWS   = [CRLF] 1*(SP | HT) 

儘管這不會破壞的報頭字段值,LWS has the same semantics as a single space

所有線性 包括摺疊在內的空白與SP具有相同的語義。

爲了保持這樣的序列,字符串在作爲字段值放置之前被編碼。

+0

好點,但用戶名或密碼中的:是什麼? – rekire

+1

@rekire更新了我的答案。 – Gumbo

5

要理解以下內容,您應該清楚地瞭解the differences between "character set" and "character encoding"

另外,請記住,Base64編碼encoding is not encryption。任何在Base64中編碼的東西都是特意容易解碼的。

Base64編碼,最重要的是,確保用戶:傳遞字符都是ASCII字符集和ASCII編碼的一部分。用戶:通過HTTP基本身份驗證是授權標頭字段值的一部分。 HTTP標頭值是ASCII(或擴展ASCII)編碼/解碼。所以,當你Base64對用戶進行編碼時:確保它是ASCII碼,因此是一個有效的標題字段值。

Base64編碼還會將至少一些混淆類型添加到明文用戶:pass。再次,這是而不是加密。但是,它確實會阻止正常人閱讀用戶:一目瞭然。從安全角度來看,這似乎幾乎沒有意義,因爲以下背景信息,我只將其包含在內。

一些背景

如果你看看RFC 2616(現在已廢棄)和RFC 2617,你會看到,他們同時定義的頭字段值基本認證用戶:通過,分別爲文本;即ISO-8859-1 OCTECT(ISO-8859-1是8位擴展ASCII編碼)。這很奇怪,因爲它使似乎像作者打算合規的用戶:pass應該使用與HTTP頭所​​需的字符集/編碼相同的字符集/編碼,在這種情況下,Base64編碼看起來似乎毫無意義,除了瑣碎的混淆。

也就是說,很難相信這些RFC的作者不認爲用戶名/密碼在非ASCII(非ISO-8859-1)字符集中。假設他們有非ASCII用戶:記住,他們可能一直在關注如何在所有ASCII頭集的中間包含/維護/傳輸非ASCII字節。 Base64編碼用戶:通過肯定能很好地解決這個問題。還有使用Base64的更多規範原因 - to make data transmission more reliable。我的理解是HTTP是8-bit clean;即使頭文件是以ASCII形式發佈的,我並不認爲用戶:pass的Base64編碼是爲了使其傳輸更加可靠。

沒有問原作者,我不確定我們會知道肯定。 Here's an interesting comment on the topic by Julian Reschke。他是RFC 5987, Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters的作者。他還在HTTP RFC上做了大量工作,包括最新的HTTP 1.1 RFC大修。

當前HTTP頭編碼處理HTTP 1.1 RFC現在推薦使用USASCII(又名ASCII,7位ASCII)標頭。 RFC 5987定義了一個頭部參數編碼規範 - 可能有些人正在使用它。 RFC 7235是HTTP認證上RFC 2617的最新更新。