视频加载失败

常用模块之base64模块

2202 字
11 分钟
常用模块之base64模块

【一】什么是base64编码#

  • Base64编码,是由64个字符组成编码集:**26个大写字母A-Z,26个小写字母a-z,10个数字0~9,符号“+”与符号“/”**组成。
  • Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后根据Base64的对应表,得到对应的编码数据。
  • 当原始数据凑不够三个字节时,编码结果中会使用额外的**符号“=”**来表示这种情况。

【二】base64原理#

【1】图示#

【2】原理#

  • 一个Base64字符实际上代表着6个二进制位(bit)
    • 4个Base64字符对应3字节字符串/二进制数据。
  • 3个字符为一组的的base64编码方式如:

  • 小于3个字符为一组的编码方式如

  • 总结:base64过程

  • 最后处理完的编码字符再转字节中不再有base64以外的任何字符。

【三】base64编解码#

【1】符合正确长度#

import base64
bs = "you".encode("utf-8")
# 把字节转化成base64编码格式
print(base64.b64encode(bs).decode())
# eW91
bs = "yo".encode("utf-8")
# 把字节转化成base64编码格式
print(base64.b64encode(bs).decode())
# eW8=
# 猜测结果
bs = "y".encode("utf-8")
# 把字节转化成base64编码格式
print(base64.b64encode(bs).decode())
# eQ==

【2】不符合正确长度#

  • 注意, b64处理后的字符串长度
  • 一定是4的倍数
  • 如果在网页上看到有些密文的b64长度不是4的倍数
  • 会报错
import base64
s = "eW91"
# base64解码
result = base64.b64decode(s)
print(result)
# b'you'
s = "eW91eQ=="
# base64解码
result = base64.b64decode(s)
print(result)
# b'youy'
s = "eW91eQ"
# base64解码
result = base64.b64decode(s)
print(result)
# binascii.Error: Incorrect padding

【四】填充数据长度#

  • 解决思路:base64长度要求. 字符串长度必须是4的倍数. 填充一下即可
import base64
s = "eW91eQ"
def pack_data(data):
# base64长度要求. 字符串长度必须是4的倍数
# 如果不是,需要填充字符串
if len(data) % 4 != 0:
data += ("=" * (4 - len(s) % 4))
return data
data = pack_data(data=s)
print("填充后", data)
result = base64.b64decode(data).decode()
print(result)

【五】为什么要使用Base64编码#

【1】Base64 编码的优点#

(1) 数据安全性和兼容性#

  • 确保数据的可打印性:Base64编码将二进制数据转换为仅包含[0-9a-zA-Z+/=]字符的字符串,这些字符均为标准的可打印ASCII字符,避免了在文本环境中传输二进制数据时可能出现的乱码或无法显示的问题。特别适用于电子邮件、网页嵌入等场景中,确保数据在各种文本媒介中都能正确呈现。

(2)兼容性与跨平台传输#

  • 适应仅支持文本的协议和环境:早期的许多网络通信协议(如SMTP、HTTP等)主要设计用于传输ASCII文本,对于二进制数据(如图片、音频、视频等)的支持有限。Base64编码使得二进制数据能够以文本形式在网络中安全传输,有效解决了非文本数据与文本协议之间的兼容问题。
  • 消除字符歧义:二进制数据中的某些字节值(如ASCII码的控制字符、空字符等)可能在特定上下文中引起误判或中断数据流。Base64编码通过限制字符集,消除了这些潜在的歧义,确保数据在传输过程中不会被错误解释或截断。

(3)结构化数据交换#

  • 便于数据封装:在JSON、XML等结构化数据格式中,Base64编码常用于嵌入二进制数据。例如,设备A将二进制数据进行Base64编码后放入JSON字符串中传递给设备B,设备B接收到JSON后先解析得到Base64字符串,再进行解码恢复原始二进制数据,实现跨平台、跨语言的数据交换。

(4)易于集成与实施#

  • 算法简单高效:Base64编码算法逻辑清晰、实现简单,计算效率高,对性能影响小。其编码和解码过程都可以快速完成,适合实时应用和大规模数据处理。
  • 标准公开:Base64是一种公开的标准编码方式,广泛应用于各个领域,无需担心专利或版权问题。任何开发者或系统都能轻松地理解和实现Base64编码/解码功能,增强了互操作性和数据共享能力。

(5)区分于加密#

  • 透明性与非保密性:虽然Base64编码后的数据具有一定的不可读性,但它本质上是一种编码而非加密手段。其编码过程是公开的,任何人都可以轻易地对Base64编码数据进行解码,获取原始信息。因此,Base64不应用于敏感信息的保护,而是作为一种提高数据传输可靠性的工具。

【2】Base64 编码的应用示例#

import base64
source = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA7VBMVEUAAAD////////s8v////+txP+qwv+4zf/w9f/2+P+hu//Q3f+yyP+4zf/Q3f////+kvv+90P+80f+2yv/S4P/T4P/M2//z9/+cuP/V4P9Whv////9Uhf9Sg/9Pgf9NgP/8/f9di/9Xh/9lkf5aif9qlP7z9//k7P/c5v+2y/94nv51nP6lv/+LrP6Ep/6BpP5gjf7v9P+wxv/U4f/M2/+sxP+vxv73+f/P3v/J2v+5zf+ivP+fuv9xmf+Ytv6Usv6Hqf58of5vl/7m7v/g6f+zyf6QsP75+//q8P/B0v/W4//C1P6+0P6qwv6ct/76fHZiAAAAGnRSTlMAGAaVR/Py45aC9Mfy2b8t9OPZ2ce/v4L0x/e74/EAAAIZSURBVDjLZVPXYuIwEDSmQ4BLv5O0ku3Yhwu2IZTQe0hy7f8/57QSoYR5sVea1c424wgzl324LRRuH7I507hEJluYucCFEOBGhWzmy7X5+N0WwIjTbrcdBsKulM0z96onGCGE2X6n+cTkj/CqJ480igzkNXp26E9JkABSbBz8i4Bn3EkH840mKHoxs49fZQzt2Kd03FQEzSB3WsejB9Jqf1CJQBM0wCurABWBoub0gkDENwyStTHA62pwSWDtklRQ4FLfjnaiPqVW60hAYeLKNHIREOZuKTL80H6XBFCwn4BAmDOyLiOQUIlOSEjaoS+Ju57NZuul73Fml4w6yAivSLBW3MGfcfBmIegmArg3alICdJHgy1jQt8Z/6CcC4DdGXhLIoiWRACpbLYbDYW80GnXp2GH8ShP+PUvEoHsAIFq9Xm8+kXlIwkkI9pm+05Tm3yWqu9EiB0pkwjWBx2i+tND1XqeZqpPU4VhUbq/ekR8CwTRVoRxf3ifTbeIwcONNsJZ2lxFVKDMv1KNvS2zXdrnD+COvR1PQpTZKNlKD3cLCOJNnivgVxkw169BunlKFaV9/B+LQbqOsByY4IVgDB59dl/cjR9TIJV1Lh7CGqUqH/DDPhhZYOPkdLz6m0X7GrzPHsSe6zJwzxvm+5NeNi8U5ABfn7mz7zHJFrZ6+BY6rd7m8kQtcAtwwXzq4n69/vZbP1+pn6/8fsrRmHUhmpYYAAAAASUVORK5CYII="
# Base64编码:已编码的图片数据source以"data URI scheme"格式存储
# 其中包含了图片类型 image/png 和 Base64编码 的图片数据。
# 通过 split(",")[1] 提取出Base64编码的字符串(s)。
s = source.split(",")[1]
with open("a.png", "wb") as f:
# Base64解码:使用`base64.b64decode(s)`对Base64编码的字符串进行解码,得到原始二进制图片数据。
# 写入文件:将解码后的二进制数据写入到名为`a.png`的文件中,完成图片数据的还原。
f.write(base64.b64decode(s))

【六】Base64编码的变种#

【1】标准Base64在特定场景下的局限性#

(1)URL编码冲突#

  • 标准Base64编码结果中包含字符/和+,这两个字符在URL中具有特殊意义。
  • URL编码器会将它们转换为形如%XX的百分号编码形式,导致编码后长度增加。
  • 此外,%字符在ANSI SQL中作为通配符使用,若将Base64编码的字符串存入数据库,可能需要额外处理。

(2)正则表达式兼容性问题#

  • 在正则表达式中,+、*等字符具有特殊含义。
  • 如果直接使用标准Base64编码结果,可能导致正则表达式解析错误。

【2】针对特定应用场景的Base64变种#

(1)URL安全的Base64编码(URL-safe Base64)#

  • 字符替换:为了适应URL环境,URL-safe Base64变种将标准Base64中的/替换为-,+替换为_,从而避免URL编码器对这些字符的特殊处理。
  • 末尾填充:与标准Base64相同,URL-safe Base64编码也可能会添加=作为填充字符。由于=在URL中不需要特殊处理,因此这种编码可以直接用于URL中,无需额外转换。
  • 优势:URL-safe Base64简化了URL编解码过程,避免了编码信息长度增加,同时也统一了数据库、表单等处对象标识符的格式,提升了数据处理的一致性和效率。

(2)正则表达式友好的Base64编码#

  • 字符替换:
    • 针对正则表达式环境,该变种将+替换为!,/替换为-,以消除与正则元字符的冲突。
  • 优势:
    • 使用这种变种的Base64编码可以在正则表达式中直接使用,无需额外转义,保证了正则表达式的正确解析和执行。

(3)其他应用场景的Base64变种#

[1] 作为编程语言标识符#

  • 字符替换:
    • 某些变种将+/替换为*-、.*、.-等组合,以满足不同编程语言对标识符命名规则的要求。
    • 例如,.*可用于那些允许.作为标识符组成部分的语言,.-则适用于XML Nmtoken。
  • XML Name与Nmtoken:
    • 另一种变种使用_<替换>+/,使其符合XML Name的语法规范,适用于XML文档中元素名或属性名的表示。

[2] 编码长度与原数据的关系#

  • 长度变化原理:
    • Base64编码将每三个8位字节转换为四个6位字节(共24位),并在每个6位字节前补两个高位0,形成四个8位字节。
    • 因此,编码后的字符串长度理论上比原始数据长1/3,且可能需要添加=作为填充字符以保持字节对齐。

【七】总结#

  • Base64编码因其简单、高效、跨平台、透明等特点,成为解决二进制数据在文本环境中传输问题的理想选择。
  • 它确保了数据的可打印性、兼容性以及在结构化数据交换中的便捷性,广泛应用于邮件附件、网页嵌入资源、API接口数据传输等各种场景。
  • 然而,需要注意的是,尽管Base64编码提供了某种程度上的“不可见性”,但它不具备安全性,不适合用于保护敏感信息。
  • 在需要保密的情况下,应结合适当的加密机制来保障数据安全。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录