爲什麼在Authorization頭文件中使用Base64編碼「username:password」的結果字符串字面值?它的背景是什麼?爲什麼在基本身份驗證中使用Base64
回答
這是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具有相同的語義。
爲了保持這樣的序列,字符串在作爲字段值放置之前被編碼。
要理解以下內容,您應該清楚地瞭解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的最新更新。
- 1. 身份驗證base64
- 2. 基本身份驗證改造+基本身份驗證
- 3. 與基本身份驗證的HTTP基本身份驗證
- 4. 爲什麼HTTPBuilder基本身份驗證不起作用?
- 5. Ansible:使用基本身份驗證
- 6. 使用基本身份驗證
- 7. 使用基於SAML的基本身份驗證進行身份驗證?
- 8. 禁用其他身份驗證的HTTP基本身份驗證
- 9. 基本socket.io身份驗證
- 10. tomcat基本身份驗證
- 11. Apache基本身份驗證
- 12. CQ基本身份驗證
- 13. Wcf基本身份驗證
- 14. 基本HTTP身份驗證
- 15. AngularJS基本身份驗證
- 16. 基本身份驗證
- 17. Ruby基本身份驗證
- 18. 基本身份驗證
- 19. 使用JavaScript獲取基本身份驗證憑證使用JavaScript獲取基本身份驗證憑證
- 20. 使用Cookie身份驗證的項目中的基本身份驗證
- 21. CakePHP 2基本身份驗證驗證
- 22. OWIN身份驗證與IIS基本身份驗證
- 23. Ajax:HTTP基本身份驗證和身份驗證Cookie
- 24. RESTful端點的身份驗證 - 基本身份驗證和XHR
- 25. CakePHP 2.0身份驗證和基本身份驗證
- 26. 基本身份驗證,回退到窗體身份驗證
- 27. Authlogic - 通過基本HTTP身份驗證進行身份驗證
- 28. 禁用基本身份驗證的Twitter - 這是什麼意思?
- 29. Base64編碼基本身份驗證標頭Apache HTTP客戶端
- 30. 使用基本身份驗證來傳遞身份驗證令牌
相關:[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) –