DEV Community

Cover image for API Anda Menghapus Metadata C2PA: Cara Mendeteksinya dengan Pengujian
Walse
Walse

Posted on Originally published at apidog.com

API Anda Menghapus Metadata C2PA: Cara Mendeteksinya dengan Pengujian

Claude kini melampirkan metadata provenansi C2PA yang ditandatangani ke file yang dihasilkannya. Model gambar OpenAI melakukan hal yang sama, begitu pula Gemini. Artinya, sinyal provenansi kini benar-benar sampai ke endpoint unggahan Anda—tetapi pipeline gambar Anda kemungkinan besar menghapusnya sebelum pengguna atau sistem lain sempat memverifikasinya.

Coba Apidog hari ini

Masalahnya biasanya bukan disengaja. Secara default, sharp().resize() membuat file baru tanpa metadata kecuali Anda memintanya secara eksplisit. ImageMagick, Pillow, dan banyak CDN gambar juga berperilaku serupa. Manifes masuk, JPEG yang lebih kecil keluar, dan log Anda tidak mencatat apa pun.

Ini adalah kegagalan yang dapat diuji. Artikel ini menunjukkan cara:

  1. Membuktikan metadata C2PA hilang dalam pipeline.
  2. Mengisolasi tahap yang menghapus atau merusaknya.
  3. Menjalankan pengujian round-trip dengan Apidog.
  4. Memverifikasi manifes pada level byte dengan c2patool di CI.

Apa yang Sebenarnya Dihancurkan

Manifes C2PA adalah blok bertanda tangan kriptografis yang tertanam dalam kontainer file. Manifes ini mencatat siapa yang menandatangani aset dan klaim yang dibuat tentang aset tersebut.

Karena ditandatangani, perubahan byte tanpa penandatanganan ulang akan membuat tanda tangan tidak valid. Verifier C2PA dapat mendeteksi kondisi ini.

Kata pentingnya adalah kontainer file. Jika pipeline Anda menulis ulang kontainer, manifes biasanya hilang atau menjadi tidak valid.

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 operasi di kolom “Tidak” umum dilakukan pada aplikasi web: membuat thumbnail, menghasilkan varian responsif, melakukan negosiasi format, atau menghapus EXIF untuk privasi.

Penghapusan EXIF perlu perhatian khusus. EXIF dapat berisi koordinat GPS atau nomor seri kamera, sehingga penggunaan -strip sering kali memang disengaja. Namun, menghapus semua metadata juga menghapus manifes C2PA.

Solusinya bukan menghapus semua metadata, melainkan menghapus blok EXIF yang sensitif secara selektif sambil mempertahankan atau memproses ulang provenansi C2PA.

Buktikan dalam Dua Menit

Sebelum mengubah pipeline, verifikasi dulu bahwa masalahnya benar terjadi.

Siapkan satu fixture gambar dengan manifes C2PA valid. Anda dapat menggunakan gambar yang dihasilkan Claude atau mengambil sampel bertanda tangan dari Content Authenticity Initiative.

Instal CLI referensi:

cargo install c2patool
Enter fullscreen mode Exit fullscreen mode

Verifikasi fixture sebelum diunggah:

c2patool fixtures/signed-sample.png
Enter fullscreen mode Exit fullscreen mode

Output seharusnya berupa laporan JSON yang mencantumkan generator klaim dan status tanda tangan.

Selanjutnya, jalankan file yang sama melalui endpoint unggahan dan URL distribusi yang digunakan frontend:

# Unggah melalui endpoint produksi atau staging Anda
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 file melalui URL delivery yang digunakan frontend
ASSET_URL=$(jq -r '.url' /tmp/upload.json)
curl -sS "$ASSET_URL" -o /tmp/roundtrip.png

# Verifikasi manifes setelah round-trip
c2patool /tmp/roundtrip.png
Enter fullscreen mode Exit fullscreen mode

Interpretasikan hasilnya seperti berikut:

  • Laporan valid: manifes dan tanda tangan bertahan.
  • Manifes tidak ditemukan: ada tahap pipeline yang menghapus metadata.
  • Kesalahan validasi: manifes masih ada, tetapi byte file telah berubah sehingga tanda tangan lama tidak lagi cocok.

Status ketiga sangat penting. Ini biasanya menunjukkan bahwa pustaka transformasi mempertahankan blok metadata saat menulis ulang piksel, tetapi tidak menandatangani ulang hasilnya.

Temukan Tahap yang Menghapusnya

Jika pengujian round-trip gagal, jangan menebak. Pecah pipeline menjadi beberapa checkpoint dan jalankan c2patool setelah setiap tahap.

Urutan investigasi yang praktis:

  1. Periksa file segera setelah unggahan.
  2. Periksa output resize atau thumbnail.
  3. Periksa hasil konversi format.
  4. Periksa file di object storage.
  5. Periksa file dari URL CDN yang diakses pengguna.

1. Resize atau thumbnail

Ini adalah tersangka utama. Dalam sharp, metadata dibuang secara default:

// Manifes C2PA kemungkinan terhapus
await sharp(input)
  .resize(1200)
  .toFile(output);
Enter fullscreen mode Exit fullscreen mode

Anda dapat meminta sharp untuk mempertahankan metadata:

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

Namun, mempertahankan blok metadata saja tidak cukup.

Resize mengubah piksel dan byte file. Artinya, tanda tangan asli tetap tidak valid untuk output baru. Agar rantai provenansi tetap benar, Anda perlu:

  1. Mempertahankan informasi relevan dari input.
  2. Menandatangani ulang output.
  3. Mencatat transformasi sebagai pernyataan tindakan, misalnya c2pa.resized.

Pustaka c2pa untuk Rust, Python, JavaScript, dan C mendukung alur ini.

2. Konversi format

Mengubah JPEG menjadi AVIF atau PNG menjadi WebP berarti membuat kontainer baru.

Pilih salah satu strategi berikut:

  • Pertahankan provenansi lalu tandatangani ulang output.
  • Akhiri rantai provenansi secara eksplisit dan jangan tampilkan klaim yang tidak dapat diverifikasi.

Jangan mempertahankan manifes lama pada file yang byte-nya sudah berubah tanpa penandatanganan ulang.

3. CDN gambar

Banyak CDN gambar melakukan resize, optimasi, atau konversi format saat file dikirim. Beberapa CDN dapat mempertahankan dan menandatangani ulang Kredensial Konten, tetapi banyak konfigurasi historisnya menghapus metadata.

Uji melalui URL delivery aktual:

curl -sS "https://cdn.example.com/assets/image.png?w=1200&format=webp" \
  -o /tmp/cdn-output.webp

c2patool /tmp/cdn-output.webp
Enter fullscreen mode Exit fullscreen mode

Jangan hanya memeriksa origin storage. Origin yang valid tidak berarti aset yang diterima pengguna juga valid.

4. Normalisasi saat unggahan

Layanan unggahan sering mengkode ulang file untuk menstandardisasi format atau mengurangi ukuran. Tahap ini mudah terlewat karena sering berada di repository infrastruktur atau worker terpisah.

Tambahkan checkpoint langsung setelah proses normalisasi untuk memastikan tahap ini tidak menghapus atau merusak manifes.

Jadikan Ini Pengujian Permanen

Satu kali curl hanya membuktikan kondisi saat ini. Itu tidak mencegah seseorang menambahkan resize, format conversion, atau aturan CDN baru pada sprint berikutnya.

Buat pemeriksaan permanen dengan dua lapisan:

  1. Pengujian API round-trip dengan Apidog.
  2. Verifikasi byte-level dengan c2patool di CI.

Lapisan satu: round-trip di Apidog

Buat skenario Apidog dengan dua request:

  1. Unggah fixture bertanda tangan.
  2. Ambil kembali file dari URL delivery yang dikembalikan API.

Langkah 1: POST /v1/assets

Konfigurasikan body sebagai multipart/form-data dan lampirkan fixture C2PA Anda. Alurnya sama dengan menguji API unggah file.

Tambahkan asersi:

  • Status respons adalah 201.
  • Respons sesuai dengan schema API Anda.
  • Respons menyertakan URL delivery.

Tambahkan skrip pasca-respons untuk menyimpan URL:

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://");
});
Enter fullscreen mode Exit fullscreen mode

Simpan ukuran fixture sebelum request, misalnya dalam environment variable FIXTURE_BYTES.

Langkah 2: GET {{ASSET_URL}}

Tambahkan asersi untuk memastikan:

  • Status respons adalah 200.
  • Content-Type sesuai format yang diharapkan.
  • Ukuran respons tidak turun secara drastis.
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);
});
Enter fullscreen mode Exit fullscreen mode

Ukuran file hanya heuristik, bukan bukti kriptografis. Namun, asersi ini murah dan efektif untuk menangkap tanda-tanda jelas bahwa file diam-diam dienkode ulang.

Untuk pola asersi tambahan, lihat panduan asersi API.

Lapisan dua: verifikasi byte-level di CI

Validasi tanda tangan membutuhkan parser kontainer file. Gunakan c2patool untuk tugas ini, bukan klien HTTP.

Contoh GitHub Actions:

# .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
Enter fullscreen mode Exit fullscreen mode

set -euo pipefail penting. Tanpa flag ini, kegagalan c2patool dapat berubah menjadi peringatan sementara build tetap hijau—tepat kondisi yang ingin Anda cegah.

Jika Anda baru menjalankan skenario Apidog dalam pipeline, lihat panduan otomatisasi pengujian API di GitHub Actions.

Lapisan tiga: endpoint verifikasi opsional

Jika provenansi adalah fitur produk, buat endpoint verifikasi di layanan Anda sendiri. Endpoint ini menjalankan pustaka c2pa dan mengembalikan hasil terstruktur.

Contoh respons:

{
  "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"
  }
}
Enter fullscreen mode Exit fullscreen mode

Gunakan minimal tiga status:

  • verified: manifes ditemukan dan tanda tangan valid.
  • absent: tidak ada manifes ditemukan.
  • invalid: manifes ada, tetapi tanda tangan tidak cocok dengan byte file.

Tambahkan unchecked jika verifier tidak tersedia. Jangan menyamakan kegagalan layanan verifikasi dengan hasil bersih.

Dokumentasikan respons ini dalam OpenAPI dan validasi spec agar field tidak hilang saat refactor. Lihat cara memvalidasi spesifikasi OpenAPI.

Empat Fixture yang Patut Disimpan

Jangan hanya menguji jalur bahagia. Simpan fixture berikut di repository bersama skenario pengujian Anda.

  1. File bertanda tangan yang valid

    Harapkan status verified. Fixture ini menangkap penghapusan metadata yang terlalu agresif.

  2. File dengan manifes dihapus

    Gunakan gambar yang sama, lalu hapus metadata dengan:

   exiftool -all= signed-sample.png
Enter fullscreen mode Exit fullscreen mode

Harapkan absent, bukan error dan bukan verified.

  1. File yang dirusak Gunakan file bertanda tangan lalu ubah satu byte setelah penandatanganan. Harapkan invalid.

Fixture ini membuktikan bahwa sistem memverifikasi tanda tangan, bukan hanya mencari keberadaan blok metadata.

  1. Format yang tidak didukung Gunakan format tanpa dukungan manifes. Harapkan absent yang bersih, bukan respons 500.

Fixture ini kecil, deterministik, dan membuat pengujian Anda benar-benar bermakna.

Mengapa Ini Penting

Ada tiga alasan utama untuk menjaga pengujian provenansi tetap aktif.

Klaim produk

Jika UI Anda menampilkan lencana provenansi, tetapi pipeline menghapus manifes pada thumbnail atau varian responsif, lencana tersebut salah untuk aset yang telah diproses.

Itu adalah masalah kepercayaan pengguna.

Kepatuhan

Jika Anda mengandalkan C2PA untuk persyaratan yang terkait dengan Pasal 50, manifes yang hilang berarti kontrol Anda tidak benar-benar bekerja. Lihat pembagian peran penyedia dan penyebar dalam UU AI UE Pasal 50 untuk pengembang API.

Nilai sinyal provenansi

Provenansi hanya berguna jika rantai tetap utuh dari sumber hingga pengguna akhir. Pipeline yang diam-diam menghapus manifes melemahkan kemampuan seluruh ekosistem untuk memverifikasi aset.

Unduh Apidog untuk membuat skenario round-trip terhadap endpoint Anda, lalu jalankan verifikasi c2patool sebagai tahap CI setelahnya.

FAQ

Apakah resize gambar menghapus metadata C2PA?

Ya, secara default pada banyak pustaka umum. Mempertahankan blok metadata membutuhkan flag eksplisit, sedangkan menjaga tanda tangan tetap valid membutuhkan penandatanganan ulang output.

Bagaimana cara memeriksa apakah file memiliki metadata C2PA?

Jalankan:

c2patool <file>
Enter fullscreen mode Exit fullscreen mode

Anda juga dapat mengunggah file ke halaman verifikasi Kredensial Konten.

Bisakah metadata C2PA dipertahankan melalui resize?

Ya, tetapi tidak cukup hanya mempertahankan metadata. Setelah resize, Anda harus menandatangani ulang output dan mencatat tindakan seperti c2pa.resized.

Apakah CDN menghapus Kredensial Konten?

Banyak CDN menghapusnya saat melakukan optimasi otomatis. Beberapa dapat mempertahankan dan menandatangani ulang secara native. Selalu uji URL delivery yang diakses pengguna, bukan hanya origin.

Apa perbedaan manifes yang dihapus dan manifes tidak valid?

absent berarti tidak ada manifes yang ditemukan. invalid berarti manifes ada, tetapi tanda tangannya tidak cocok dengan byte file—biasanya karena file berubah setelah ditandatangani.

Bisakah Apidog memverifikasi tanda tangan C2PA secara langsung?

Apidog mengatur pengujian round-trip dan asersi HTTP, termasuk asersi terhadap endpoint verifikasi Anda. Verifikasi tanda tangan pada level byte adalah tugas c2patool atau pustaka c2pa di layanan Anda.

Haruskah EXIF dihapus untuk privasi tetapi C2PA dipertahankan?

Ya, itu target yang tepat. Hindari -strip secara menyeluruh karena akan menghapus keduanya. Hapus blok EXIF sensitif secara selektif dan biarkan manifes C2PA tetap diproses dengan benar.

Poin Penting

Metadata provenansi dapat tiba di API Anda dalam keadaan valid lalu hilang setelah resize, konversi format, normalisasi unggahan, atau optimasi CDN.

Buat pengaman permanen:

  1. Simpan fixture C2PA yang valid, dihapus, rusak, dan tidak didukung.
  2. Jalankan round-trip melalui endpoint dan URL delivery sebenarnya.
  3. Gunakan Apidog untuk mengorkestrasi alur API.
  4. Gunakan c2patool di CI untuk menggagalkan build saat manifes hilang atau tanda tangan tidak valid.

Dengan pengaturan singkat ini, klaim provenansi di UI Anda berubah dari asumsi menjadi jaminan yang benar-benar ditegakkan oleh pipeline.

Top comments (0)