生成校验和——文件的 MD5 或 SHA-256 函数等加密哈希几乎不是什么新鲜事,也是确定文件完整性或检查两个文件是否相同的最有效方法之一。
然而,生成一个包含其自己的校验和作为其内容的一部分的文件是一项相当艰巨的任务,如果由于过程中涉及的悖论而看似不可能的话。
这并没有阻止研究人员创建包含文件的 MD5 校验和的 PNG 图像,在构成图像的像素矩阵中可见
带有1337哈希的 leet 图像
逆向工程师和研究员 David Buchanan 在 Twitter 上分享了一张包含自己哈希的图片后,再次让所有人感到惊讶。
ZZQIDC确认该图像的校验和为 1337e2ef42b9bee8de06a4d223a51337, 这是图像本身垂直显示的字符。
注意:下面嵌入的图像已被压缩,因此正确丢失。读者可以用 研究人员分享的原图进行实验。为了冗余,我们保留了原始图像:

校验和是一个较小的数据块,甚至是一个数字,它源自另一组数字数据,作为检测可能发生的错误或数据损坏的一种手段。这个想法是原始文件或数据片段发生的任何微小变化都会改变其校验和,表明数据的完整性现在无效。
当时的大多数数字技术都使用加密哈希函数(如 MD5、SHA1、SHA256 等)来相当快地生成文件校验和。
对于您可能拥有或创建的任何文件,您可以在您的 PC、Mac或其他设备上轻松计算其MD5 校验和。而且,即使是字符或像素对文件内容的最轻微更改也会极大地改变其校验和。您可以通过重新计算更改文件的校验和来尝试此操作。
这使得通过普通方式在其内容中包含文件的校验和是一种非常矛盾的情况。
您首先需要文件的校验和或哈希值才能将此信息包含在文件本身的内容中。但是通过编辑或更改文件这样做将有效地更改文件的校验和,因此使这种做法看起来是不可能的。
但是,针对安全研究员0xabad1dea(“一个坏主意”)在 2013 年提出的挑战,Buchanan 本周通过创建这样 一个文件解决了这个难题。
“这条推文中的图像显示了它自己的 MD5 哈希值,”布坎南在推文中写道。
“你可以自己下载和散列它,它应该仍然匹配 – 1337e2ef42b9bee8de06a4d223a51337”
“我认为这是第一个 PNG/MD5 hashquine。”
Hashquines:包含自己校验和的文件
Buchanan 本质上创建的东西通俗地称为“ Hashquine ”,这是硬件和软件爱好者在 2017 年创造的一个术语, 用来指代显示自己哈希值的文件。
同年,名为 spq 和Ange Albertini的谷歌安全工程师 通过分别生成 GIF 和 Postscript 文件成功展示了这一概念,这些文件显示了他们自己的哈希作为文件内容的一部分:

另一位研究人员 Rogdham 后来在 GitHub 上提供了“ GIF-MD5-hashquine ”源代码,几乎任何人都可以在使用 MD5 作为哈希选择的同时生成此类 GIF。
然而,布坎南今天所展示的,基本上使 MD5 hashquine 技术可以用于 PNG 文件。
“我想我是在 2017 年看到spq的 GIF hashquine后第一次意识到 hashquines ,”Buchanan 在电子邮件采访中告诉ZZQIDC。
“从那时起,我就想做一个 PNG hashquine。我想了一会儿,但还是想不通——用于 GIF 文件格式的相同技巧不能直接应用于 PNG。”
从那时起,研究人员从事了几个涉及 PNG 图像的项目。
正如ZZQIDC首次报道的那样,布坎南在 2021 年制作了一张在苹果设备和非苹果设备上看起来非常不同的神秘图像 。
在此之前,研究人员演示了使用 Twitter 图片打包整个 ZIP 档案和 MP3 文件。
“通过这些,我学到了更多关于 PNG 文件格式的血腥细节,以及在 Twitter 不允许你上传之前你可以破坏图像的严重程度的限制。”
似乎研究人员已经想出创建一个完美的 PNG-MD5 哈希奎因,Twitter 不会阻止或更改 – 无论如何现在。
“凭借我对 PNG 文件格式的改进知识,以及比 2017 年更快的 PC,我终于找到了一种可行的方法。”
Buchanan 在 Twitter 线程中分享了详细的技术故障,说明他如何能够使用哈希奎因,这与利用 哈希冲突有关:
“大多数(全部?)现有的 hashquines 依赖于使用冲突来改变文件中不同部分的边界。我想不出如何用 PNG 来做到这一点(尤其是在保持 twitter 兼容的情况下),”Buchanan 说。
“相反,我将所有碰撞都放在图像数据本身中。碰撞块包含随机垃圾数据,看起来像这样:”

在为这一挑战制定解决方案时,Buchanan 派生了一个“聪明的 PNG 调色板”,它有 256 个条目,第一个是红色的,其他的都是黑色的。
“只要我的碰撞块不包含任何为 0 的字节,所有随机垃圾最终都只是黑色像素。有时碰撞块确实包含零 – 我只是继续尝试,直到它们不包含。”
研究人员与ZZQIDC分享的另一个关键见解是,必须仔细设计用于在他的 PNG 中打印 MD5 哈希的字体,以避免因碰撞而导致“垃圾字节”流入下一个像素,这会改变图像。
“这是其中一个数字的特写,你可以看到每行只有一个红色像素,”研究人员告诉ZZQIDC。

“我必须像这样仔细设计字体,否则一次碰撞产生的垃圾字节会进入下一个像素。”
指着图片,Buchanan 进一步解释说,“右侧的垃圾来自数字冲突,但下边缘的垃圾来自用于纠正 adler32 校验和的冲突(crc32 冲突是不可见的,它们实际上是发生的)结束后)。”
似乎还需要一段时间,就像 Rogdham 一样,Buchanan 也能够发布他的 PNG-MD5 hashquines 代码。
研究人员告诉ZZQIDC,他正在进一步完善当时“有点像 rube goldberg机器”的代码,并且可能正在撰写一篇论文。