base64 — Base16、Base32、Base64、Base85 数据编码

源代码: Lib/base64.py


此模块提供了用于将二进制数据编码为可打印 ASCII 字符以及将此类编码解码回二进制数据的函数。它为 RFC 4648 中指定的编码(定义了 Base16、Base32 和 Base64 算法)以及事实上的标准 Ascii85 和 Base85 编码提供了编码和解码函数。

RFC 4648 编码适用于对二进制数据进行编码,以便可以通过电子邮件安全地发送、用作 URL 的一部分或作为 HTTP POST 请求的一部分包含在内。编码算法与 uuencode 程序不同。

此模块提供了两个接口。现代接口支持将 类字节对象 编码为 ASCII bytes,并将包含 ASCII 的 类字节对象 或字符串解码为 bytes。支持 RFC 4648 中定义的两个 base-64 字母表(正常字母表以及 URL 和文件系统安全字母表)。

旧版接口不支持从字符串解码,但它确实提供了用于对 文件对象 进行编码和解码的函数。它仅支持 Base64 标准字母表,并且根据 RFC 2045 每 76 个字符添加换行符。请注意,如果您正在寻找 RFC 2045 支持,您可能应该查看 email 包。

在 3.3 版更改: 现代接口的解码函数现在接受仅 ASCII 的 Unicode 字符串。

在 3.4 版更改: 此模块中的所有编码和解码函数现在都接受任何 类字节对象。添加了 Ascii85/Base85 支持。

现代接口提供

base64.b64encode(s, altchars=None)

使用 Base64 对 类字节对象 s 进行编码,并返回编码后的 bytes

可选的 altchars 必须是长度为 2 的 类字节对象,它为 +/ 字符指定了替代字母表。这允许应用程序例如生成 URL 或文件系统安全的 Base64 字符串。默认值为 None,将使用标准 Base64 字母表。

如果 altchars 的长度不为 2,则可能会断言或引发 ValueError。如果 altchars 不是 类字节对象,则引发 TypeError

base64.b64decode(s, altchars=None, validate=False)

解码 Base64 编码的 类字节对象 或 ASCII 字符串 s 并返回解码后的 bytes

可选的 altchars 必须是长度为 2 的 类字节对象 或 ASCII 字符串,它指定了用于代替 +/ 字符的替代字母表。

如果 s 的填充不正确,则引发 binascii.Error 异常。

如果 validateFalse(默认值),则在填充检查之前,将丢弃既不在正常 base-64 字母表中也不在替代字母表中的字符。如果 validateTrue,则输入中这些不在字母表中的字符将导致 binascii.Error

有关严格 base64 检查的更多信息,请参阅 binascii.a2b_base64()

如果 altchars 的长度不为 2,则可能会断言或引发 ValueError

base64.standard_b64encode(s)

使用标准 Base64 字母表对 类字节对象 s 进行编码,并返回编码后的 bytes

base64.standard_b64decode(s)

使用标准 Base64 字母表解码 类字节对象 或 ASCII 字符串 s 并返回解码后的 bytes

base64.urlsafe_b64encode(s)

使用 URL 和文件系统安全的字母表对 类字节对象 s 进行编码,该字母表使用 - 替换标准 Base64 字母表中的 +,并使用 _ 替换 /,并返回编码后的 bytes。结果可能仍然包含 =

base64.urlsafe_b64decode(s)

使用 URL 和文件系统安全的字母表对 类字节对象 或 ASCII 字符串 s 进行解码,该字母表使用 - 替换标准 Base64 字母表中的 +,并使用 _ 替换 /,并返回解码后的 bytes

base64.b32encode(s)

使用 Base32 对 类字节对象 s 进行编码,并返回编码后的 bytes

base64.b32decode(s, casefold=False, map01=None)

解码 Base32 编码的 类字节对象 或 ASCII 字符串 s,并返回解码后的 bytes

可选参数 casefold 是一个标志,用于指定是否接受小写字母作为输入。出于安全考虑,默认值为 False

RFC 4648 允许将数字 0(零)可选地映射到字母 O(欧),并将数字 1(一)可选地映射到字母 I(艾)或字母 L(埃尔)。当可选参数 map01 不为 None 时,它指定数字 1 应该映射到哪个字母(当 map01 不为 None 时,数字 0 始终映射到字母 O)。出于安全考虑,默认值为 None,因此输入中不允许出现 0 和 1。

如果 s 的填充不正确或输入中存在非字母字符,则会引发 binascii.Error

base64.b32hexencode(s)

b32encode() 类似,但使用 RFC 4648 中定义的扩展十六进制字母表。

3.10 版新增。

base64.b32hexdecode(s, casefold=False)

b32decode() 类似,但使用 RFC 4648 中定义的扩展十六进制字母表。

此版本不允许将数字 0(零)映射到字母 O(欧),也不允许将数字 1(一)映射到字母 I(艾)或字母 L(埃尔),所有这些字符都包含在扩展十六进制字母表中,并且不可互换。

3.10 版新增。

base64.b16encode(s)

使用 Base16 对 类字节对象 s 进行编码,并返回编码后的 bytes

base64.b16decode(s, casefold=False)

解码 Base16 编码的 类字节对象 或 ASCII 字符串 s,并返回解码后的 bytes

可选参数 casefold 是一个标志,用于指定是否接受小写字母作为输入。出于安全考虑,默认值为 False

如果 s 的填充不正确或输入中存在非字母字符,则会引发 binascii.Error

base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

使用 Ascii85 对 类字节对象 b 进行编码,并返回编码后的 bytes

foldspaces 是一个可选标志,使用特殊短序列“y”代替 4 个连续空格(ASCII 0x20),如“btoa”所支持的。 “标准”Ascii85 编码不支持此功能。

wrapcol 控制是否应在输出中添加换行符(b'\n')。如果此值不为零,则每行输出最多为这么多字符,不包括尾随换行符。

pad 控制在编码之前是否将输入填充为 4 的倍数。请注意,btoa 实现始终进行填充。

adobe 控制编码的字节序列是否以 <~~> 作为框架,这是 Adobe 实现中使用的。

3.4 版新增。

base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\x0b')

解码 Ascii85 编码的类字节对象或 ASCII 字符串 *b* 并返回解码后的 bytes

*foldspaces* 是一个标志,用于指定是否应将“y”短序列接受为 4 个连续空格(ASCII 0x20)的简写。 “标准”Ascii85 编码不支持此功能。

*adobe* 控制输入序列是否为 Adobe Ascii85 格式(即以 <~ 和 ~> 括起来)。

*ignorechars* 应该是一个类字节对象或 ASCII 字符串,其中包含要从输入中忽略的字符。 这应该只包含空格字符,默认情况下包含 ASCII 中的所有空格字符。

3.4 版新增。

base64.b85encode(b, pad=False)

使用 base85(例如,在 git 风格的二进制差异中使用)对类字节对象 *b* 进行编码,并返回编码后的 bytes

如果 *pad* 为 true,则在编码之前,输入将使用 b'\0' 填充,使其长度为 4 个字节的倍数。

3.4 版新增。

base64.b85decode(b)

解码 base85 编码的类字节对象或 ASCII 字符串 *b* 并返回解码后的 bytes。 如果需要,将隐式删除填充。

3.4 版新增。

旧版接口

base64.decode(input, output)

解码二进制 *input* 文件的内容,并将生成的二进制数据写入 *output* 文件。 *input* 和 *output* 必须是文件对象。 将读取 *input*,直到 input.readline() 返回一个空的字节对象。

base64.decodebytes(s)

解码类字节对象 *s*,它必须包含一行或多行 base64 编码的数据,并返回解码后的 bytes

3.1 版新增。

base64.encode(input, output)

对二进制 *input* 文件的内容进行编码,并将生成的 base64 编码数据写入 *output* 文件。 *input* 和 *output* 必须是文件对象。 将读取 *input*,直到 input.read() 返回一个空的字节对象。 根据 RFC 2045(MIME),encode() 在每 76 个字节的输出后插入一个换行符 (b'\n'),并确保输出始终以换行符结尾。

base64.encodebytes(s)

类字节对象 *s* 进行编码,它可以包含任意二进制数据,并返回包含 base64 编码数据的 bytes,根据 RFC 2045(MIME),在每 76 个字节的输出后插入换行符 (b'\n'),并确保有一个尾随换行符。

3.1 版新增。

模块的使用示例

>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
>>> data = base64.b64decode(encoded)
>>> data
b'data to be encoded'

安全注意事项

RFC 4648 中添加了一个新的安全注意事项部分(第 12 部分);建议查看部署到生产环境的任何代码的安全部分。

另请参阅

模块 binascii

支持模块,包含 ASCII 到二进制和二进制到 ASCII 的转换。

RFC 1521 - MIME(多用途互联网邮件扩展)第一部分:用于指定和描述互联网消息正文格式的机制

第 5.2 节“Base64 内容传输编码”提供了 base64 编码的定义。