http - 为什么在基本身份验证中使用 Base64

标签 http header basic-authentication

为什么 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/

相关文章:

javascript - CORS HTTP header 点

python - 鼠兔将 header 添加到 nack 响应

android - 如何使用 iTextLibrary 在动态 pdf 中添加页眉和页脚?

javascript - HTTP Basic Auth 中的自定义 HTML 登录表单

ruby-on-rails - 如何在 Controller 的 Rails 5 测试中测试或绕过 Basic Auth

jsp :include 处的 Tomcat MemoryRealm 身份验证

http - 当消息正文为空时,是否应该存在 Content-Type header ?

node.js - http statusCode 有时未定义

java - 如何读取 JAX-RS 服务中的授权 header

javascript - 实现客户端 WebHook 处理程序?