API Anda Menghapus Metadata C2PA: Cara Mendeteksinya dengan Pengujian

Claude, Gemini, dan OpenAI kini melampirkan manifes C2PA yang ditandatangani pada berkas yang dihasilkan, sehingga bukti asal-usul yang sebenarnya tiba di titik akhir unggahan Anda dan alur kerja Anda mungkin menghapusnya. Curl dua menit membuktikannya, dan pengujian tiga lapis memperbaikinya.

Ashley Innocent

Ashley Innocent

12 August 2026

API Anda Menghapus Metadata C2PA: Cara Mendeteksinya dengan Pengujian

Apidog untuk Perusahaan

Penerapan On-Premises

SSO & RBAC

Sesuai SOC 2

Jelajahi Apidog Enterprise

Claude kini melampirkan metadata provenansi C2PA yang ditandatangani ke file yang dihasilkannya. Begitu juga dengan model gambar OpenAI, dan begitu pula Gemini. Ini berarti sinyal provenansi yang sebenarnya tiba di titik akhir unggahan Anda untuk pertama kalinya, dan kemungkinan besar pipeline Anda menghapusnya sebelum ada yang melihatnya.

Bukan karena kesengajaan. Secara default. sharp().resize() menghasilkan file bersih tanpa metadata kecuali Anda meminta sebaliknya. Begitu pula dengan ImageMagick. Begitu pula dengan Pillow. Begitu pula dengan sebagian besar CDN gambar. Manifes masuk, JPEG yang lebih kecil keluar, dan tidak ada yang disebutkan di log Anda.

Ini adalah kegagalan yang dapat diuji, dan pengujiannya tidak rumit. Berikut adalah bagaimana metadata mati dalam pipeline normal, bagaimana membuktikan bahwa itu terjadi, dan bagaimana menghubungkan pemeriksaan bolak-balik ke CI agar tidak terulang lagi. Apidog menangani orkestrasi; c2patool menangani verifikasi tingkat byte.

button

Apa yang Sebenarnya Dihancurkan

Manifes C2PA adalah blok yang ditandatangani secara kriptografis yang tertanam dalam kontainer file. Ini mencatat siapa yang menandatangani aset dan apa yang diklaim tentangnya, dan karena ditandatangani, mengubah byte tanpa penandatanganan ulang akan mematahkan tanda tangan dengan cara yang dapat dideteksi oleh pembaca mana pun.

Tingkat kontainer adalah frasa operatif. Tulis ulang kontainer dan manifes akan hilang.

Operasi Manifes bertahan secara default?
Salin atau pindahkan byte-demi-byte Ya
sharp().resize().toBuffer() Tidak
ImageMagick convert / magick Tidak
Pillow Image.save() Tidak
PNG ke WebP, JPEG ke AVIF Tidak
Optimasi otomatis CDN Gambar Biasanya tidak
Tangkapan layar Tidak
Simpan ulang dari editor gambar Tidak
Unggahan S3 tanpa transformasi Ya

Semua yang ada di kolom "Tidak" adalah sesuatu yang dilakukan aplikasi web normal pada setiap gambar yang diterimanya. Gambar mini, varian responsif, negosiasi format, pembersihan EXIF untuk privasi. Masing-masing masuk akal secara terpisah, dan masing-masing secara diam-diam mengakhiri rantai provenansi.

Perlu dicatat: kebiasaan `-strip` yang dimotivasi oleh privasi seringkali disengaja, karena EXIF membawa koordinat GPS dan nomor seri kamera. Menghapus semua metadata untuk menghapus data lokasi juga menghapus manifes provenansi. Kedua tujuan ini kini bertentangan, dan menyelesaikannya berarti bersikap selektif daripada menghapus seluruh blok.

Buktikan dalam Dua Menit

Sebelum membangun apa pun, pastikan Anda memiliki masalah tersebut. Anda memerlukan satu file dengan manifes yang valid. Gambar apa pun yang dihasilkan Claude berfungsi, atau ambil sampel yang ditandatangani dari Content Authenticity Initiative.

Instal CLI referensi:

cargo install c2patool

Periksa apakah fixture tersebut benar-benar ditandatangani:

c2patool fixtures/signed-sample.png

Anda akan mendapatkan laporan JSON yang menyebutkan generator klaim dan status tanda tangan. Sekarang dorong melalui tumpukan Anda sendiri dan periksa ujung lainnya:

# Unggah melalui titik akhir Anda yang sebenarnya
curl -sS -X POST https://api.example.com/v1/assets \
  -H "Authorization: Bearer $API_TOKEN" \
  -F "file=@fixtures/signed-sample.png" \
  -o /tmp/upload.json

# Ambil kembali melalui URL yang akan digunakan frontend Anda
ASSET_URL=$(jq -r '.url' /tmp/upload.json)
curl -sS "$ASSET_URL" -o /tmp/roundtrip.png

# Apakah manifes bertahan?
c2patool /tmp/roundtrip.png

Tiga kemungkinan hasil, dan masing-masing memiliki arti yang berbeda:

Hasil ketiga itulah yang harus dicari. Ini biasanya berarti pustaka transformasi mempertahankan blok metadata saat menulis ulang piksel.

Temukan Langkah yang Melakukannya

Jika perjalanan pulang-pergi gagal, bagi dua pipeline tersebut. Periksa manifes segera setelah setiap tahap daripada menebak.

Tersangka umum berdasarkan kemungkinan:

1. Langkah pengubahan ukuran atau thumbnail. Pelaku yang paling mungkin. Di sharp, metadata dihapus kecuali Anda menyimpannya secara eksplisit:

// Menghapus manifes C2PA
await sharp(input).resize(1200).toFile(output);

// Mempertahankan blok metadata
await sharp(input).resize(1200).keepMetadata().toFile(output);

Mempertahankan blok itu perlu tetapi tidak cukup. Piksel berubah, sehingga tanda tangan asli tidak lagi valid terhadap byte baru. Untuk menjaga rantai provenansi yang berfungsi, Anda menandatangani ulang output dan mencatat transformasi sebagai pernyataan tindakan, biasanya c2pa.resized. Pustaka c2pa untuk Rust, Python, JavaScript, dan C semuanya mendukung ini.

2. Konversi format. Menyajikan AVIF atau WebP berarti kontainer baru. Aturan yang sama: pertahankan dan tandatangani ulang, atau terima bahwa rantai berakhir di sana dan katakan demikian.

3. CDN. Banyak CDN gambar menulis ulang saat pengiriman. Beberapa kini mempertahankan dan menandatangani ulang Kredensial Konten secara asli; sebagian besar secara historis menghapusnya. Uji melalui URL pengiriman yang sebenarnya diakses pengguna Anda, bukan melalui origin, atau Anda akan mendapatkan hasil hijau yang tidak berarti apa-apa.

4. Normalisasi unggahan. Layanan yang mengkode ulang saat masuk untuk menstandardisasi format mudah dilupakan, karena kode berada di repo infrastruktur yang tidak ada yang membacanya.

Jadikan Ini Uji Permanen

Satu kali curl membuktikan status saat ini. Ini tidak menghentikan seseorang menambahkan langkah pengubahan ukuran pada sprint berikutnya. Pemeriksaan perlu berada di CI.

Bagilah menjadi dua lapisan, karena dua alat yang berbeda ahli dalam dua hal yang berbeda.

Lapisan satu: perjalanan pulang-pergi, di Apidog

Orkestrasi adalah pengujian API berantai normal: unggah fixture, tangkap URL yang dikembalikan, ambil kembali aset melalui jalur pengiriman yang sebenarnya, pastikan apa yang kembali.

Di Apidog, ini adalah skenario pengujian dengan dua langkah.

Langkah 1: POST /v1/assets

const body = pm.response.json();
pm.environment.set("ASSET_URL", body.url);
pm.test("upload returns a delivery URL", function () {
    pm.expect(body.url).to.be.a("string").and.to.include("https://");
});

Langkah 2: GET {{ASSET_URL}}

const uploadedBytes = Number(pm.environment.get("FIXTURE_BYTES"));
const returnedBytes = pm.response.responseSize;
pm.test("asset was not silently re-encoded", function () {
    pm.expect(returnedBytes).to.be.above(uploadedBytes * 0.9);
});

Ukuran adalah heuristik, bukan bukti. Ini menangkap kegagalan yang jelas dengan murah dan berjalan dalam rangkaian yang sama dengan yang lainnya. Pola asersi standar dibahas dalam asersi API.

Lapisan dua: pemeriksaan tingkat byte, di CI

Memverifikasi tanda tangan berarti mengurai kontainer, yang merupakan tugas c2patool, bukan klien HTTP. Jalankan sebagai langkah pipeline terhadap file yang diambil oleh perjalanan pulang-pergi:

# .github/workflows/provenance.yml
name: provenance
on: [pull_request]

jobs:
  c2pa-round-trip:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install c2patool
        run: cargo install c2patool

      - name: Install Apidog CLI
        run: npm install -g apidog-cli

      - name: Run the round-trip scenario
        run: |
          apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
            -t "$SCENARIO_ID" -e "$ENV_ID" -r cli,html --out-dir ./apidog-reports
        env:
          APIDOG_ACCESS_TOKEN: ${{ secrets.APIDOG_ACCESS_TOKEN }}
          SCENARIO_ID: ${{ vars.PROVENANCE_SCENARIO_ID }}
          ENV_ID: ${{ vars.APIDOG_ENV_ID }}

      - name: Verify the manifest survived
        run: |
          set -euo pipefail
          curl -sS "$ASSET_URL" -o /tmp/roundtrip.png
          c2patool /tmp/roundtrip.png > /tmp/report.json
          jq -e '.validation_status == null or (.validation_status | length) == 0' /tmp/report.json

set -euo pipefail penting. Tanpa itu, c2patool yang gagal pada file yang dihapus akan menghasilkan peringatan dan build hijau, yang merupakan kegagalan persis yang ingin Anda cegah. Jika Anda baru menjalankan skenario Apidog dalam pipeline, mengotomatiskan pengujian API di GitHub Actions mencakup pengaturan.

Lapisan tiga, opsional: titik akhir verifikasi

Jika provenansi adalah fitur produk daripada pemeriksaan internal, desain paling bersih adalah titik akhir kecil di layanan Anda sendiri yang menjalankan pustaka c2pa dan mengembalikan hasil terstruktur. Maka semuanya dapat diuji sebagai JSON biasa, dan frontend Anda mendapatkan jawaban yang sebenarnya alih-alih tebakan.

{
  "asset_id": "img_9f2c41",
  "provenance": {
    "status": "verified",
    "standard": "c2pa",
    "signer": "Anthropic",
    "signature_valid": true,
    "checked_at": "2026-08-11T09:14:22Z",
    "tool": "c2patool/0.9"
  }
}

Pertahankan tiga status, bukan dua. verified, absent, dan invalid memiliki arti yang benar-benar berbeda, dan menggabungkan absent dan invalid menjadi satu boolean membuang sinyal paling menarik yang Anda miliki. Tambahkan unchecked jika verifier Anda tidak tersedia, agar pemadaman tidak menyamar sebagai hasil yang bersih.

Dokumentasikan bentuknya dalam definisi OpenAPI Anda dan validasi terhadapnya, agar bidang tidak hilang dalam refactor. Cara memvalidasi spesifikasi OpenAPI mencakup sisi itu.

Empat Fixture yang Patut Disimpan

Rangkaian provenansi membutuhkan input yang sengaja dirusak, bukan hanya jalur yang "bahagia".

  1. File yang ditandatangani valid. Harapkan verified. Menangkap penghapusan yang terlalu bersemangat.
  2. File yang dihapus. Gambar yang sama, manifes dihapus dengan exiftool -all=. Harapkan absent, bukan kesalahan dan jelas bukan verified.
  3. File yang dirusak. File yang ditandatangani dengan satu byte diubah setelah penandatanganan. Harapkan invalid. Ini adalah yang membuktikan Anda memeriksa tanda tangan daripada hanya memeriksa keberadaan blok.
  4. Format yang tidak didukung. Sesuatu tanpa dukungan manifes sama sekali. Harapkan absent yang bersih daripada 500.

Komit keempatnya ke repo di samping skenario pengujian. Mereka kecil, tidak pernah berubah, dan mereka adalah perbedaan antara pengujian yang berhasil dan pengujian yang berarti.

Mengapa Repot-repot

Tiga alasan, dalam urutan meningkatnya seberapa besar biayanya bagi Anda.

Klaim produk Anda. Jika UI Anda menampilkan lencana provenansi, dan pipeline Anda menghapus manifes, lencana tersebut salah untuk setiap aset yang melewati pengubahan ukuran. Itu adalah masalah kepercayaan yang akan Anda ketahui dari pengguna.

Kisah kepatuhan Anda. Jika Anda mengandalkan C2PA untuk hal-hal yang berkaitan dengan Pasal 50, manifes yang dihapus adalah kontrol yang tidak berfungsi. Pembagian penyedia dan penyebaran dalam UU AI UE Pasal 50 untuk pengembang API menjelaskan tugas mana yang sebenarnya menjadi tanggung jawab Anda.

Sinyal itu sendiri. Provenansi hanya berfungsi jika rantai terjaga dari ujung ke ujung. Setiap pipeline yang diam-diam menghilangkan manifes membuat seluruh ekosistem kurang berguna, termasuk bagi Anda saat Anda mencoba memverifikasi sesuatu.

Unduh Apidog untuk membangun skenario perjalanan pulang-pergi terhadap titik akhir Anda sendiri, kemudian sambungkan langkah c2patool di belakangnya.

FAQ

Apakah mengubah ukuran gambar menghapus metadata C2PA? Ya, secara default di setiap pustaka umum. Mempertahankan blok metadata memerlukan flag eksplisit, dan menjaga tanda tangan yang valid memerlukan penandatanganan ulang output yang diubah.

Bagaimana cara memeriksa apakah sebuah file memiliki metadata C2PA? Jalankan c2patool <file> dari baris perintah, atau letakkan file ke halaman verifikasi Kredensial Konten.

Bisakah saya mempertahankan metadata C2PA melalui pengubahan ukuran? Ya, tetapi tidak hanya dengan mempertahankan. Pertahankan bloknya, lalu tandatangani ulang output dengan pernyataan tindakan seperti c2pa.resized menggunakan salah satu pustaka c2pa. Jika tidak, tanda tangan lama tidak lagi cocok dengan byte baru.

Apakah CDN menghapus Kredensial Konten? Banyak yang melakukannya saat mereka mengoptimalkan secara otomatis. Beberapa sekarang mempertahankan dan menandatangani ulang secara native. Uji melalui URL pengiriman yang diakses pengguna Anda, bukan melalui origin.

Apa perbedaan antara manifes yang dihapus dan yang tidak valid? Dihapus berarti tidak ada manifes yang ditemukan, yang tidak memberi tahu Anda apa pun tentang asal file. Tidak valid berarti manifes ada tetapi tanda tangannya tidak cocok dengan byte, yang berarti file berubah setelah penandatanganan. Pertahankan sebagai status terpisah.

Bisakah Apidog memverifikasi tanda tangan C2PA secara langsung? Ia mengatur perjalanan pulang-pergi dan melakukan asersi pada respons HTTP, termasuk JSON titik akhir verifikasi. Penguraian tanda tangan itu sendiri adalah tugas c2patool, dijalankan sebagai langkah CI atau di dalam layanan Anda sendiri. Gunakan keduanya bersama-sama.

Haruskah saya menghapus EXIF untuk privasi tetapi menyimpan C2PA? Itu adalah tujuan yang tepat dan membutuhkan pendekatan selektif. `-strip` secara menyeluruh menghapus keduanya. Hapus blok EXIF yang Anda pedulikan secara spesifik dan biarkan manifes C2PA utuh.

Poin Penting

Metadata provenansi tiba di API Anda dalam keadaan utuh dan biasanya keluar dalam keadaan terpisah-pisah, dan tidak ada yang akan memberi tahu Anda di pemantauan Anda. Solusinya adalah fixture, perjalanan pulang-pergi melalui jalur pengiriman yang sebenarnya, dan pemeriksaan c2patool yang menggagalkan build.

Dua puluh menit pengaturan, dan ini mengubah klaim yang Anda buat di UI Anda menjadi jaminan yang benar-benar ditegakkan oleh pipeline Anda.

button

Mengembangkan API dengan Apidog

Apidog adalah alat pengembangan API yang membantu Anda mengembangkan API dengan lebih mudah dan efisien.