文件签名检测

看文件头几个字节:它到底是什么,以及名字有没有说谎。

只读前 512 字节,在浏览器里完成、不会上传。你会拿到真实格式、MIME 类型和头部字节 —— 以及当扩展名与内容不符时的明确警告。

什么时候会用到

  • 文件打不开,你怀疑扩展名是错的 —— 有人把 PNG 改名成 .jpg,或者把 ZIP 改名成 .docx。
  • 你正要因为一个名字去信任某个文件,想在信任之前做一次成本极低的核对。
  • 下载下来的文件根本没有扩展名,需要先知道它是什么,才能决定用哪个程序打开。
  • 上传被拒绝,提示「不是有效的图片」,你要分清是字节不对,还是解析器在挑刺。

别的文件类型检测工具差在哪里

多数工具读的是文件名,然后把扩展名报还给你。那正是你本来就有的信息,也正是你现在怀疑的东西。

在线检测站要求你先上传。对一个还没打开过的文件来说,这一刻恰恰是最不该把它交给第三方的时刻。

有些工具能列出一百种格式,却从不说「这两者对不上」,把比对的工作留给你自己 —— 而比对恰恰是唯一有意义的那部分。

还有的报的是操作系统猜的 MIME 类型,而那个猜测又是从扩展名来的。把猜测包装成测量结果。

文件签名对照表

每一行都是检测器实际执行的规则:某个偏移处的一段固定字节。一行里列出两组字节时,两组都必须匹配 —— 只有 RIFF 并不能说明它是 WebP;MP4 与 QuickTime 的区别就在偏移 8 处的 brand。

格式扩展名偏移魔术字节(hex)MIME 类型
PNGpng089 50 4E 47 0D 0A 1A 0Aimage/png
JPEGjpg, jpeg, jpe, jfif0FF D8 FFimage/jpeg
GIFgif047 49 46 38image/gif
WebPwebp0, 852 49 46 46 · 57 45 42 50image/webp
BMPbmp, dib042 4Dimage/bmp
TIFF(小端)tif, tiff049 49 2A 00image/tiff
TIFF(大端)tif, tiff04D 4D 00 2Aimage/tiff
ICO / CURico, cur000 00 01 00image/x-icon
AVIFavif4, 866 74 79 70 · 61 76 69 66image/avif
HEIC / HEIFheic, heif4, 866 74 79 70 · 68 65 69 63image/heic
PDFpdf025 50 44 46application/pdf
GZIPgz, tgz01F 8Bapplication/gzip
RARrar052 61 72 21 1A 07application/vnd.rar
7-Zip7z037 7A BC AF 27 1Capplication/x-7z-compressed
ZIPzip050 4B 03 04application/zip
ZIP(空档案)zip050 4B 05 06application/zip
ZIP(分卷)zip050 4B 07 08application/zip
SQLite 3sqlite, db, db3053 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00application/vnd.sqlite3
TARtar25775 73 74 61 72application/x-tar
WAVwav0, 852 49 46 46 · 57 41 56 45audio/wav
AVIavi0, 852 49 46 46 · 41 56 49 20video/x-msvideo
Oggogg, oga, opus04F 67 67 53audio/ogg
FLACflac066 4C 61 43audio/flac
MP3(ID3 标签)mp3049 44 33audio/mpeg
MP3(帧同步)mp30FF FBaudio/mpeg
QuickTime MOVmov4, 866 74 79 70 · 71 74 20 20video/quicktime
MP4mp4, m4v, m4a466 74 79 70video/mp4
WebAssemblywasm000 61 73 6Dapplication/wasm
ELFelf, so, o07F 45 4C 46application/x-elf
PE(Windows EXE/DLL)exe, dll, sys04D 5Aapplication/vnd.microsoft.portable-executable
Java classclass0CA FE BA BEapplication/java-vm

常见问题

文件签名是什么?

文件签名(也叫魔数)是文件开头一小段固定字节,用来标识格式。PNG 以 89 50 4E 47 开头,PDF 以字符 %PDF 开头,ZIP 以 PK 开头。打开文件的软件读的是这几个字节,扩展名只是给人看的。

为什么改了扩展名还是打不开?

因为程序按字节判断,不按名字判断。把 photo.png 改名成 photo.jpg,变的只是文件列表里那个标签,开头几个字节仍然是 PNG。有些程序会尝试嗅探内容来补救,所以改名后的文件有时能打开、有时显示成破图。

文件会被上传吗?

不会。页面用浏览器自己的文件接口只读前 512 字节,比对在 JavaScript 里完成。没有上传步骤,也没有可接收的服务器。你可以在拖入文件之前打开开发者工具的网络面板盯着看:一个请求都不会发。

为什么 DOCX 被识别成 ZIP?

因为它就是 ZIP。现代的 Office 文档、APK 安装包、JAR 包,都是内部结构特定的 ZIP 容器。要区分它们得读压缩包索引,本工具不读 —— 所以它如实报告「这是 ZIP」,而不是猜是哪一种 ZIP。

为什么文本文件没有签名?

因为纯文本没有文件头。TXT、JSON、CSV 以及大多数源码文件都直接从内容开始,不存在可匹配的魔数。本工具会明确说明这一点,而不是拿扩展名编一个格式出来。

其它工具

指南