什么是Base64编码的目的,为什么在HTTP基本认证中使用它?

173

我不理解Base64加密。

如果有人可以解密Base64字符串,它的用途是什么?

为什么它被用于HTTP基本认证?

这就像告诉别人我的密码被反转为OLLEH。

看到OLLEH的人会知道原始密码是HELLO。


1
相关:为什么在基本认证中使用Base64和HTTP基本认证中的Base64编码。 - Hawkeye Parker
https://security.stackexchange.com/questions/29916/why-does-http-basic-authentication-encode-the-username-and-password-with-base64 - n611x007
13
Base64 不是加密,而是一种编码方式。 - n611x007
7个回答

293

Base64不是加密,而是一种编码方式。它是一种使用可打印字符(文本)来表示二进制数据的方法。

参见HTTP基本认证维基百科页面的以下段落:

使用Base64算法对用户名和密码进行编码通常使它们难以被肉眼读取,但与编码一样,解码也同样容易。安全不是编码步骤的目的。相反,编码的目的是将可能存在于用户名或密码中的非HTTP兼容字符编码为HTTP兼容字符。


4
同时,似乎获取字符串中的“二进制数据”所需的相关字符编码应为[iso-8859-1](http://en.wikipedia.org/wiki/ISO/IEC_8859-1)。([来源](https://dev59.com/0Ww05IYBdhLWcg3wcRUj)) - Myobis
Base64是一种密码,因此它是“加密”。 - user3064538

66

通常称为base64编码,而不是加密! base64编码的好处在于,它允许您只使用可用字符的有限公共子集来表示(二进制)数据,比如仅写一个ASCII码串的1和0更有效率。


7
+1,但与将数据存储在1和0的流中进行比较过于夸张了。更好的比较是将其与以十六进制格式存储数据进行比较。因为十六进制只会比原始流增加x2倍的字节量,而1和0则会增加x8倍的字节量。(Base64使数据比原始字节数多出x1.3)。因此,有时将二进制流编码为十六进制字符串并将字节量翻倍是可以接受的,例如仅将密码哈希存储在数据库中。 - Agnius Vasiliauskas

34

加密需要一个密钥(字符串或算法)才能解密;因此出现了“crypt”(根源:密码学

编码将一个字符代码转换成另一个代码。在这种情况下,数据的常规字节现在可以使用HTTP轻松表示和传输。


7
加密的意思就是“使隐藏”- 基于密钥的密码学是一种非常近期的发明。加密是一种编码形式,已经被用作加密(尽管几百年来没有任何12岁以上的人使用过)。 - user23743
2
加密在口语中是指最近的加密模式,特别是计算机加密,它是基于密钥的(公钥/私钥)。虽然如此,指出一个过时词汇的字面定义是不必要的;否则,你将会争论今天使用的许多英语单词的历史定义。口语(有时是俚语)赋予单词上下文和定义。 - vol7ron
1
我不认为你听起来很粗鲁;我同意你对现代环境的观点。词语和定义在不断演变。我认为“编码”和“加密”在现代计算中绝对有两个非常明显的定义,而你的答案很好地概括了它们之间的区别。 - Dan Bechard
Base64编码是一种混淆形式,它的意思是使内容变得不清晰。对于许多应用程序来说,这已经足够了,因为目标只是为了混淆通过网络发送的任何明文。 - Dominic Cerisano
8
@DominicCerisano说:不,Base64编码不算加密方式,希望你不要使用它来保护任何东西。 - Ry-
@Ryan,这确实不是强加密,我同意只有在需要弱加密的情况下才应该考虑它。需要举个例子吗? - Dominic Cerisano

22

Base-64编码是MIME规范的一部分。它提供了一种传输安全的编码方式,用于在数据通过使用与原始客户端不同的编码方案的主机中继时,防止数据损坏或混乱。

互联网上存在许多不同的主机,你不能假定除7位ASCII外还支持其他任何编码方式,否则会有数据丢失/混淆的风险。

例如,IBM大型机使用一种名为EBCDIC(有许多不同的版本)的编码方式。它的代码点与基于ASCII的计算机完全不同--在ASCII中,字母A-Z是0x41 - 0x5A; 在EBCDIC中,字母A - Z甚至不是连续的范围:字母A-I位于0xC1 - 0xC9,字母J-R位于0xD1 - 0xD9,字母S-Z位于0xE2 - 0xE9。


20

20
在日常语言中,“代码”是指某种秘密的东西。但在科学和工程领域,“代码”仅仅是一种约定,一组规则,用来描述如何编写某些内容。
这个“代码”可能是秘密的。如果是这样,它就被称为加密。但通常情况下,“代码”并不是秘密的。以基因密码为例,它只是简单地说明我们的DNA由四种不同的碱基(A、C、G和T)构成,而三个碱基组合在一起形成一个氨基酸。还有一张表格,说明哪三个字母组成哪个氨基酸。
这个“代码”没有任何秘密性。
同样地,Base64也不是秘密代码。相反,它是一种允许使用每个字符的六位存储数据的编码方式(因此有64个不同的实体,即系统的“基数”为64,就像我们十进制系统的基数为10一样,因为有10个不同的实体被称为“数字”)。

3

默认情况下,超文本传输协议(HTTP)消息中的消息头字段参数不能包含ISO-8859-1字符集之外的字符。

如果用户名和密码包含不兼容的字符集,则HTTP将无法传输这些文本。为了防止这种情况发生,我们使用Base64编码对用户名和密码进行编码,以确保我们通过HTTP发送的是兼容HTTP的字符。更多信息请参见基本访问身份验证


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接