为啥要对 Authorization 标头进行 base64 编码?

Posted

技术标签:

【中文标题】为啥要对 Authorization 标头进行 base64 编码?【英文标题】:Why should you base64 encode the Authorization header?为什么要对 Authorization 标头进行 base64 编码? 【发布时间】:2016-01-27 21:34:03 【问题描述】:

Twitter 的 API 需要发送 Authorization 标头,该标头是 API 密钥的 base64 编码与 API 密钥连接。在 Node 中,我使用:

var base64 = new Buffer(apiKey + ':' + apiSecret).toString('base64');

发送的header变成:

Authorization: 'Basic ' + base64

base64 编码字符串“apiKeyHere:apiSecretHere”的意义何在?为什么不直接接受包含原始 api 凭据的 Authorization 标头?

这个问题类似于What is the purpose of base 64 encoding and why it used in HTTP Basic Authentication?,但投票的答案并没有完全回答我的问题。 Twitter 的 api 密钥和 api 密钥已经是 HTTP 兼容字符。它们看起来像这样(这些不是真实的):

消费者密钥(API 密钥)8dme3utVQfOhlPk5BUG9XbFxR

消费者秘密(API 秘密)QFZXoC7MP72JZtGMBNpjLGI4Vl1xr1q9dyPLp3u7jGtkESpbLm

那么为什么用 base64 编码呢?此外,该帖子指出“编码的目的是将可能在用户名或密码中的非 HTTP 兼容字符编码为与 HTTP 兼容的字符。”用户名和密码不是已经是 HTTP 兼容字符了吗?

【问题讨论】:

What is the purpose of base 64 encoding and why it used in HTTP Basic Authentication?的可能重复 我想这在某种程度上回答了它,但不完全是。该答案指出“编码的目的是将可能在用户名或密码中的非 HTTP 兼容字符编码为与 HTTP 兼容的字符。”。 Twiter 的 apiKey 和 apiSecret 已经是 HTTP 兼容字符。用户名和密码不是已经包含 HTTP 兼容字符了吗? 【参考方案1】:

尽管我在 w3 文档中找不到它,但我相信它只是将 Authorization 标头的凭据编码为 base64 的协议,无论它有什么内容。在 Twitter 的情况下,它并没有像您所说的那样有太大的区别,但在其他情况下,凭据可以包含这些字符。为了保持统一并防止出现是否应该编码的错误,所有凭证都应该编码。

另一个原因可能是,浏览器也以相同的方式对凭据进行编码。 Twitter 可能也想接受这一点。

【讨论】:

谢谢。你能想到数据不包含 HTTP 兼容字符的情况吗? 用户名或密码包含任何非 ASCII 字符的任何情况,以及提到的任何令牌分隔符here。 (请参阅this 问题。) 我相信已经使用了一个字符集,这是一种将文本表示为字节的方法。然后,如果您对这些字节进行 base 64 编码,这是一种将字节编码为文本的方法,该格式可以安全地跨协议传输。它只使用可能被它通过的不同协议误解为控制代码的文本字符。【参考方案2】:

RFC7617(和旧的RFC2617)中描述了基本身份验证方案。

这是向服务器发送密码凭据的标准方式。 base64 编码用于对凭据进行编码,以允许发送非 HTTP 字符和多字节字符串。

【讨论】:

【参考方案3】:

默认情况下,Hypertext Transfer Protocol (HTTP) 消息中的消息头字段参数不能携带 ISO-8859-1 字符集之外的字符。

如果用户名和密码包含不兼容的字符集,HTTP 将无法携带这些文本。 为了防止这种情况发生,我们使用 base64 对用户名和密码进行编码,以确保我们通过 HTTP 发送与 HTTP 兼容的字符。 欲了解更多信息,请参阅Basic_access_authentication

【讨论】:

【参考方案4】:

字符串应该是base64编码的,不是为了安全,而是将不兼容HTTP的字符编码成可能在用户名或密码中的HTTP兼容字符。

【讨论】:

以上是关于为啥要对 Authorization 标头进行 base64 编码?的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Authorization HTTP 标头

AzureStorage:服务器未能对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名

为啥我无法在 Web Api 中获取标头?

我应该对 API 密钥使用 Authorization 标头吗

为啥要对url进行encode

如何修复 Spring Security Authorization 标头未通过?