惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
PCI Perspectives
PCI Perspectives
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Heimdal Security Blog
S
Security @ Cisco Blogs
N
News | PayPal Newsroom
J
Java Code Geeks
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
V
V2EX
WordPress大学
WordPress大学
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
月光博客
月光博客
AI
AI
小众软件
小众软件
The GitHub Blog
The GitHub Blog
MongoDB | Blog
MongoDB | Blog
A
Arctic Wolf
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
F
Full Disclosure
B
Blog RSS Feed
Forbes - Security
Forbes - Security
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
Jina AI
Jina AI
Cisco Talos Blog
Cisco Talos Blog
U
Unit 42
Project Zero
Project Zero
H
Hacker News: Front Page
Y
Y Combinator Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
S
Secure Thoughts
The Hacker News
The Hacker News
Microsoft Azure Blog
Microsoft Azure Blog

戴兜的小屋

Hi! 2024 - 戴兜的小屋 优雅地实现滚动容器遮罩 - 戴兜的小屋 [简中] Google Summer of Code & Chrome Extensions - 戴兜的小屋 Google Summer of Code & Chrome Extensions - 戴兜的小屋 SCSS+WindiCSS实现主题色切换 - 戴兜的小屋 Plaid CTF Writeup [Treasure Map/CSS] - 戴兜的小屋 写一个炫酷的个人名片页✨✨ - 戴兜的小屋 【戴兜的游戏安利】Hi-Fi RUSH,不可多得的动作爽游 - 戴兜的小屋 Manifest V3扩展Content Script绕过CSP限制点击页面内元素 - 戴兜的小屋 在 Nuxt.js 中配合 windicss 实现暗黑模式适配 - 戴兜的小屋 实现滚动时Header自动隐藏 - 戴兜的小屋 你好!2023 - 戴兜的小屋 !important导致TransitionGroup失效 - 戴兜的小屋 新年快乐! - 戴兜的小屋 CSS Layout API初探:瀑布流布局实现 - 戴兜的小屋 你好! 2022 - 戴兜的小屋 手撸一个前端天气卡片 - 戴兜的小屋 Hi!2021 - 戴兜的小屋 服务器又搬迁啦! - 戴兜的小屋
base64数据隐写实现原理分析 - 戴兜的小屋
戴兜文章作者 · 2020-04-15 · via 戴兜的小屋

在开始这篇文章前,先让我们来看一组base64编码的字符串

ZG==
YY==
aW==
ZF==
cm==
aM==
b2==
dc==
c2==
Zf==

解码后的内容是daidrhouse,似乎没有什么问题。但是仔细看,第一行和第4行解码后的结果都是d,但内容竟然不太一样?

按照正常的base64编码,daidrhouse应该得到下面的结果。

ZA==
YQ==
aQ==
ZA==
cg==
aA==
bw==
dQ==
cw==
ZQ==

显然,与前者相比,每串base64的第二个字符都被改变了,但解码后的内容依然不变,这得从base64编码的原理说起。

什么是base64

顾名思义,base64编码就是用64个ascii字符作为基础来编码二进制内容的一种编码方式。相信各位一定在网页中看到过base64编码的内嵌图片,甚至QQ音乐传输歌词文件时,也采用了base64编码。将二进制编码为ascii字符,使数据在某些场景下更便于阅读、便于传输。当然,将所有二进制「浓缩」到区区64个字符来表示,一定会在体积上作出妥协。字符在编码完成后,会增大1/3倍,至于原因,下面会讲到。

索引表

base64有一张标准编码表,为64个ascii字符排序并赋予索引。

索引字符索引字符索引字符索引字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

有时为了防止混淆(比如链接),会使用 . _ 来代替索引表中的 + /

编码方式

base64将3个字节(24位)作为一组进行处理。不足3字节时填充0,并在结尾使用 = 来标识填充的字节数。并将每6位作为1小组,将24位编码成4组6位二进制。此时,这6位二进制一共有 2^6=64 种情况,正好能够用64个字符来表示。(这也解释了为什么编码完成后体积会增大1/3)

举些栗子

隐写的原理

base64在解码的时候,会按照字符串末尾的 = 数量来删除相应字节数。或许你已经发现了,当一组字符的数量为1字节或2字节的时候,会有4位或2位二进制在解码时被忽略,及下图的红色标识。

红色标识的这些二进制,能够被编码,但解码时却会被忽略。修改这些位置的内容,不会影响到原始数据。

解决问题

现在,可以来尝试解决文章开头的问题了。那组base64编码的字符串,隐藏了什么?

将所有红色标识的二进制位拼接起来,可以得到最后的结果hello