toolfree

檔案簽章檢查

在你的瀏覽器裡讀取檔案開頭的位元組,判斷它真正的格式,而不是副檔名宣稱的格式。附完整的 magic number 對照表。

在你的瀏覽器中執行

或把檔案拖進來

檔案簽章對照表

格式簽章副檔名MIME 類型
PNG89 50 4E 47 0D 0A 1A 0A.pngimage/png
JPEGFF D8 FF.jpg .jpegimage/jpeg
GIF (87a)47 49 46 38 37 61.gifimage/gif
GIF (89a)47 49 46 38 39 61.gifimage/gif
BMP42 4D.bmpimage/bmp
WebP52 49 46 46 · 8: 57 45 42 50.webpimage/webp
TIFF (little-endian)49 49 2A 00.tif .tiffimage/tiff
TIFF (big-endian)4D 4D 00 2A.tif .tiffimage/tiff
Photoshop38 42 50 53.psdimage/vnd.adobe.photoshop
Windows icon00 00 01 00.icoimage/x-icon
Windows cursor00 00 02 00.curimage/x-icon
HEIC4: 66 74 79 70 · 8: 68 65 69 63.heicimage/heic
AVIF4: 66 74 79 70 · 8: 61 76 69 66.avifimage/avif
SVG3C 3F 78 6D 6C.svgimage/svg+xml
WAV52 49 46 46 · 8: 57 41 56 45.wavaudio/wav
AVI52 49 46 46 · 8: 41 56 49 20.avivideo/x-msvideo
MP3 with ID3 tag49 44 33.mp3audio/mpeg
FLAC66 4C 61 43.flacaudio/flac
Ogg容器4F 67 67 53.ogg .oga .opusapplication/ogg
MP4容器4: 66 74 79 70.mp4 .m4a .m4vvideo/mp4
Matroska / WebM容器1A 45 DF A3.mkv .webmvideo/x-matroska
PDF25 50 44 46 2D.pdfapplication/pdf
RTF7B 5C 72 74 66.rtfapplication/rtf
Legacy Office (.doc, .xls, .ppt)容器D0 CF 11 E0 A1 B1 1A E1.doc .xls .ppt .msiapplication/x-ole-storage
PostScript25 21.ps .epsapplication/postscript
ZIP (and .docx, .xlsx, .jar, .apk, .epub, .odt)容器50 4B 03 04.zip .docx .xlsx .pptx .jar .apk .epub .odtapplication/zip
ZIP (empty archive)50 4B 05 06.zipapplication/zip
gzip容器1F 8B.gz .tgzapplication/gzip
bzip242 5A 68.bz2application/x-bzip2
xzFD 37 7A 58 5A 00.xzapplication/x-xz
Zstandard28 B5 2F FD.zstapplication/zstd
7-Zip37 7A BC AF 27 1C.7zapplication/x-7z-compressed
RAR (1.5–4.x)52 61 72 21 1A 07 00.rarapplication/vnd.rar
RAR (5.0+)52 61 72 21 1A 07 01 00.rarapplication/vnd.rar
tar (POSIX)容器257: 75 73 74 61 72.tarapplication/x-tar
Debian package / ar archive容器21 3C 61 72 63 68 3E.deb .aapplication/vnd.debian.binary-package
ELF (Linux executable)7F 45 4C 46application/x-elf
DOS / Windows executable4D 5A.exe .dllapplication/vnd.microsoft.portable-executable
Mach-O 64-bitCF FA ED FEapplication/x-mach-binary
Java class — or a Mach-O universal binaryCA FE BA BE.classapplication/java-vm
WebAssembly00 61 73 6D.wasmapplication/wasm
Script with a shebang23 21.sh .py .pltext/x-shellscript
SQLite database53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00.sqlite .dbapplication/vnd.sqlite3
WOFF font77 4F 46 46.wofffont/woff
WOFF2 font77 4F 46 32.woff2font/woff2
OpenType font4F 54 54 4F.otffont/otf
TrueType font00 01 00 00 00.ttffont/ttf
Text with a UTF-8 byte order markEF BB BF.txttext/plain
Text with a UTF-16 LE byte order markFF FE.txttext/plain
Text with a UTF-16 BE byte order markFE FF.txttext/plain

只讀取開頭 512 個位元組,而且是在你的瀏覽器裡讀的。沒有任何東西被上傳。

副檔名是說法,位元組才是證據

檔名結尾是 .jpg,只說明了有人決定這樣叫它,完全沒有說裡面是什麼。開頭那幾個位元組通常會說: 大多數二進位格式的開頭都是一段固定的樣式,也就是 magic number,放在那裡的用意正是讓程式 不必相信檔名就能認出檔案。

把檔案拖到上面,這個頁面會讀開頭 512 個位元組,告訴你它們說了什麼。它不會多讀,也不會把任何東西 送出去——這正是重點,因為你會想查一個檔案的類型,通常就是因為你不信任它。

不一致代表什麼,不代表什麼

副檔名與位元組不一致時,頁面會直說。無害的常見原因:

比較不無害的原因:披著圖片副檔名的腳本或執行檔,或者刻意做成同時是兩種合法格式的 polyglot 檔案。 不一致是「值得看一下」的理由,不是判決。

而相符能證明的,比看起來少得多。 magic number 就只是開頭那幾個位元組。一個檔案可以用 %PDF- 開頭,而其餘幾乎全是別的東西。簽章檢查是一道快速的篩子,不是驗證器。

最容易搞錯的幾個情況

PK 不等於「一個 ZIP 檔」

50 4B 03 04——PK 加兩個控制位元組,取自 Phil Katz——是每一個 ZIP 壓縮檔的開頭。它同時也是 每一個 .docx.xlsx.pptx.odt.jar.apk.epub 的開頭,因為這些本來就是 ZIP,只是內部有約定好的結構。再怎麼讀開頭的位元組都分不出來,只能把壓縮檔打開看裡面有什麼。

RIFFftyp 要看第二段

有些格式先放一個通用的容器標記,真正的格式在後面幾個位元組:

位移 0位移 8格式
RIFFWEBPWebP
RIFFWAVEWAV
RIFFAVI AVI

ISO base media 也一樣:ftyp 在位移 4,品牌代碼在 8——所以 MP4、MOV、HEIC、AVIF 的前四個 位元組完全相同。任何「一個格式一個樣式」的對照表在這裡都會出錯。

CA FE BA BE 是兩種東西

它是 Java .class 檔的 magic number,1991 年選它是因為那是一個唸得出來的十六進位單字。它同時 也是 macOS 上 Mach-O universal binary 的 magic number。兩個都對;只挑一個講的工具是在猜。

tar 的簽章在第 257 個位元組

ustar 出現在位移 257,不在開頭,因為 tar 比「把標頭放在檔案最前面」這個慣例還早。只讀前十六個 位元組的話,每一個 tar 檔都會認不出來。

根本沒有簽章的格式

純文字、CSV、JSON、HTML、JavaScript、Markdown、大部分原始碼——一個都沒有,因為它們從來不是設計成 讓機器讀四個位元組就認出來的。頁面說「沒有已知的檔案簽章」時,那往往是正確答案,不是失敗。

例外是 byte order mark:文字檔開頭的 EF BB BF 是 UTF-8 BOM,也是 CSV 偶爾在第一格多出  的原因。

相關

全部在你的瀏覽器裡完成。若要驗證檔案的內容而不是類型, 雜湊產生器用同樣的方式做指紋。