为什么 username:password
的结果字符串文字在 Authorization header 中使用 Base64 编码?它的背景是什么?
最佳答案
要看懂下面的内容,你应该对the differences between "character set" and "character encoding"有一个清晰的认识.
此外,请记住 Base64是一个编码,encoding is not encryption .以 Base64 编码的任何内容都特意易于解码。
Base64最重要的是,编码确保 user:pass 字符都是 ASCII 的一部分。字符集和 ASCII 编码。 HTTP Basic auth 中的 user:pass 是 Authorization header 字段值的一部分。 HTTP header 值是 ASCII(或扩展 ASCII)编码/解码的。因此,当您对 user:pass 进行 Base64 编码时,您可以确保它是 ASCII,因此是一个有效的 header 字段值。
Base64 编码还至少为明文 user:pass 添加了 一些 类型的混淆。同样,这不是不是加密。但是,它确实会阻止普通人一目了然地阅读 user:pass。从安全角度来看,这似乎几乎没有意义,我只是因为以下背景信息才将其包括在内。
一些背景
如果你看看RFC 2616 (现已过时)和 RFC 2617 ,您会看到它们分别将 header 字段值 和 Basic auth user:pass 定义为 TEXT;即 ISO-8859-1 OCTECT(ISO-8859-1 是一种 8 位扩展 ASCII 编码)。这很奇怪,因为它使它看起来像作者的意图一样合规的 user:pass 应该使用与 HTTP header 所需的字符集/编码相同的字符集/编码,在这种情况下,Base64 编码似乎毫无意义除了琐碎的混淆。
也就是说,很难相信那些 RFC 的作者没有想到用户名/密码在非 ASCII(非 ISO-8859-1)字符集中。假设他们有非 ASCII user:passes 想法,他们可能会担心如何在全 ASCII header 集的中间包含/维护/传输非 ASCII 字节。对 user:pass 进行 Base64 编码可以很好地解决这个问题。使用 Base64 还有更规范的原因 -- to make data transmission more reliable .我的理解是 HTTP 是 8-bit clean ;尽管 header 以 ASCII 格式发送,但我认为 user: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 header 编码的当前 HTTP 1.1 RFC,RFC 7230 ,现在建议使用 USASCII(又名 ASCII,7 位 ASCII)作为 header 。 RFC 5987定义一个 header 参数编码规范——大概有些人正在使用它。 RFC 7235是对 HTTP 身份验证的 RFC 2617 的最新更新。
关于http - 为什么在基本身份验证中使用 Base64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13661384/