最適合誰
需要處理不可信來源上傳、做安全掃描、或在 pipeline 裡正確識別「這個檔案實際上是什麼」的工程師。如果你曾經擔心有人把 ELF 二進位檔改名叫 .jpg 混進上傳接口,Magika 就是為了解決這個問題而設計的。
我實際怎麼用
CLI 日常用法:拿到來源不明的檔案,先跑 magika -i -s file,一次看到 MIME type 和信心分數。信心分數低於 0.5,我會把這個檔案當作加密/壓縮內容處理,或是 Magika 訓練覆蓋不足的罕見格式,接到人工審核佇列或用其他工具輔助判斷。
Python 掃描腳本裡,Magika() 只初始化一次,後續每個檔案約 5ms,批次處理幾百個上傳沒問題。信心分數讓我可以分路由:安全敏感路徑用高信心模式(低於閾值標為 unknown),一般掃描用中等閾值,下游流程需要一定有值時用 best-guess 模式。
--jsonl 輸出加 jq 後處理,可以快速撈出偵測類型和宣稱副檔名不符的檔案,這種差異通常值得多看一眼。
有一點要先說清楚:brew install magika 裝的是 Rust CLI,不含 Python 模組。要用 Python API(from magika import Magika),需要另外 pip install magika 或 pipx install magika。這個差異第一次遇到很容易搞混。
真正強的地方
- ~99% 準確率,1 億筆訓練樣本。能辨識需要手寫規則才能處理的格式,新格式只要收集訓練樣本重訓,不需要寫規則
- 辨識偽裝檔案:改 magic bytes 可以騙過
file指令,但騙不過全文統計特徵分析。這是安全場景選 Magika 而不是傳統工具的核心理由 - 模型載入後每檔 ~5ms,批次處理效率夠。Rust CLI 啟動比 Python 版快,適合 shell script 大量呼叫
- Google 生產驗證:Gmail、Drive、Safe Browsing、VirusTotal 全都在跑,不是學術論文工具
- 多語言 SDK:Python 做應用整合,Rust CLI 用於 scripts 和 CI/CD(不需 Python 依賴),JavaScript/TypeScript 給 Node 環境,Go 還在開發中
- 信心分數有三種操作模式:high confidence(嚴格,低假陽性)、medium confidence(覆蓋率高)、best-guess(一定給出答案)。Python API 回傳原始
score浮點數,可以自己設閾值邏輯
失敗模式與不該用的情境
- 加密/壓縮內容信心分數低。加密後統計特徵消失,Magika 只能給出低信心猜測,你需要另外建立這類邊界案例的處理路徑
- 速度比
file指令慢 100-1000 倍:file是微秒級,Magika 是 ~5ms。實時封包分析或微秒延遲敏感場景不適合 - Python 版需要
onnxruntime,在邊緣裝置或受限環境部署有門檻。v1.0.2 已移除 numpy 直接依賴,情況有改善 - 200+ 種格式覆蓋度不錯,但長尾格式的訓練樣本不足,準確率會低於 ~99% 的平均數。值得用你自己的檔案實測
價格、上手門檻與風險
開源,Apache 2.0,商業使用無授權問題。brew install magika 或 pip install magika 直接裝,不需要設定。初學者門檻低。
風險低:模型本地執行,沒有網路呼叫,資料不離機。ONNX Runtime 是成熟依賴,安全紀錄良好。
結論
如果你要處理不可信來源的檔案,又在意偽裝惡意檔案的問題,Magika 是直接的選擇。Google 生產驗證加上 15k stars 不只是背書,工具本身確實能用。記住 brew install magika 裝的是 CLI 不是 Python 模組,也不要期待它在延遲敏感場景取代 file 指令。
工作量以加密/壓縮檔案為主、或部署在無法跑 ONNX Runtime 的邊緣硬體上,這個工具不適合。