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.
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:
- Membuktikan metadata C2PA hilang dalam pipeline.
- Mengisolasi tahap yang menghapus atau merusaknya.
- Menjalankan pengujian round-trip dengan Apidog.
- Memverifikasi manifes pada level byte dengan
c2patooldi 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
Verifikasi fixture sebelum diunggah:
c2patool fixtures/signed-sample.png
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
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:
- Periksa file segera setelah unggahan.
- Periksa output resize atau thumbnail.
- Periksa hasil konversi format.
- Periksa file di object storage.
- 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);
Anda dapat meminta sharp untuk mempertahankan metadata:
// Mempertahankan blok metadata
await sharp(input)
.resize(1200)
.keepMetadata()
.toFile(output);
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:
- Mempertahankan informasi relevan dari input.
- Menandatangani ulang output.
- 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
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:
- Pengujian API round-trip dengan Apidog.
- Verifikasi byte-level dengan
c2patooldi CI.
Lapisan satu: round-trip di Apidog
Buat skenario Apidog dengan dua request:
- Unggah fixture bertanda tangan.
- 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://");
});
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-Typesesuai 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);
});
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
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"
}
}
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.
File bertanda tangan yang valid
Harapkan statusverified. Fixture ini menangkap penghapusan metadata yang terlalu agresif.File dengan manifes dihapus
Gunakan gambar yang sama, lalu hapus metadata dengan:
exiftool -all= signed-sample.png
Harapkan absent, bukan error dan bukan verified.
-
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.
-
Format yang tidak didukung
Gunakan format tanpa dukungan manifes. Harapkan
absentyang bersih, bukan respons500.
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>
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:
- Simpan fixture C2PA yang valid, dihapus, rusak, dan tidak didukung.
- Jalankan round-trip melalui endpoint dan URL delivery sebenarnya.
- Gunakan Apidog untuk mengorkestrasi alur API.
- Gunakan
c2patooldi 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)