Linkage
Laboratorium interaktif yang mengenali ulang orang di data sintetis, bukti bahwa menghapus nama tidak membuat data anonim

- serangan re-identifikasi, diskor terhadap kebenaran
- 6
- kasus memasangkan pertahanan dengan serangannya
- 5
- record sintetis digambar pada 60 fps
- 200.000
- cara memuat dataset asli
- 0
Di halaman ini
Masalahnya
Instansi pemerintah dan perusahaan merilis data "anonim" dengan menghapus nama dan nomor identitas, lalu menganggap urusannya selesai. Kenyataannya tidak begitu. Yang mengenali seseorang adalah gabungan data biasa, seperti kecamatan, tanggal lahir, dan jenis kelamin, yang masing-masing tampak tidak sensitif. Sebuah studi terkenal menemukan 87% penduduk Amerika Serikat unik berdasarkan kode pos, jenis kelamin, dan tanggal lahir. Studi ulang kemudian mendapat 63%, dan sampai sekarang kedua angka itu belum pernah didamaikan.
Pengelola data biasanya mengenal masalah ini sebagai kutipan. Mereka membaca "87%" tapi tidak bisa menilai apakah angka itu berlaku untuk data yang akan mereka rilis. Saya ingin menggantinya dengan alat ukur: jalankan serangannya sendiri, lihat berapa orang yang berhasil dikenali, pasang pertahanan standar, lalu saksikan serangan berikutnya menembus pertahanan itu.
Yang saya bangun
Aplikasi ini hanya bekerja pada populasi buatannya sendiri
Alat yang menerima dataset asli lalu membantu mengenali ulang orang-orang di dalamnya adalah alat re-identifikasi, apa pun bunyi teks pengantarnya. Karena itu Linkage membangkitkan populasi sintetis sendiri di browser dan menyimpan kebenaran tentang siapa pemilik setiap record. Dengan begitu aplikasi bisa memberi tahu, misalnya, bahwa Anda mengenali 340 dari 500 target, lalu menunjukkan 160 yang gagal. Tidak ada cara untuk memuat berkas atau menempelkan data, dan sebuah tes memindai situs hasil build lalu menggagalkan build kalau cara itu muncul.
Mengecek data sendiri cukup dengan deskripsi kolom
Pengelola data tetap perlu menilai rilis mereka sendiri. Penilai skema hanya menerima deskripsi tiap kolom: nama, tipe, dan jumlah nilai berbeda di dalamnya. Input-nya tidak punya tempat untuk baris data, dan hal itu dicek oleh tes. Hasilnya berupa perkiraan keunikan, lengkap dengan asumsinya: kolom dianggap saling bebas, sehingga kolom yang berkorelasi membuat hasilnya tampak lebih aman dari kenyataannya.
Setiap serangan melaporkan skor
Keenam serangan tidak bisa menyatakan sebuah record dapat dikenali tanpa hitungan pendukungnya: dicoba, benar, salah, dan gagal. Untuk setiap target, serangan juga melaporkan berapa kandidat yang tersisa. Serangan yang menyempitkan 500.000 record menjadi tiga sudah mengerjakan sebagian besar tugasnya meski belum tuntas, dan layar menunjukkan hal itu.
Setiap kasus berakhir dengan serangan berikutnya
Ada lima kasus berskenario. Masing-masing menjalankan serangan, memasang pertahanan yang menghentikannya, lalu menjalankan serangan yang lolos dari pertahanan itu. Rantainya berjalan dari linkage ke k-anonymity, homogenitas, l-diversity, skewness, differencing, dan akhirnya differential privacy beserta anggarannya. Untuk differential privacy, saya menurunkan besar derau yang dibutuhkan tiap jenis kueri dan menampilkan cara hitungnya, karena memakai satu nilai untuk semua kueri diam-diam merusak jaminannya.
200.000 orang dalam satu layar
Tampilan utama menggambar 200.000 record sintetis pada 60 frame per detik dan mengelompokkannya ke dalam kelas berisi orang-orang yang tampak identik di data. Saat data digeneralisasi, kelas-kelas itu melebur di layar. Posisi setiap record saya kunci kecuali kelasnya sendiri berubah, supaya peleburannya mudah dibaca. Ada juga pembedah NIK yang menunjukkan bahwa 16 digit NIK memuat tiga data yang sama, yaitu wilayah, tanggal lahir, dan jenis kelamin. Jadi menyamarkan digit terakhirnya justru menyembunyikan satu-satunya bagian yang tidak berbahaya.
Hasilnya
Linkage sudah live dan terbuka untuk umum, sebagai versi pertama yang utuh tanpa backend dan tanpa akun. Selain lima kasus, ada sandbox bebas berisi dua belas instrumen, termasuk pencarian generalisasi terkecil yang memenuhi target, digambar dari catatan asli pencarian itu tentang apa saja yang diujinya. Seluruh aplikasi diunduh sebesar 113,8 KB terkompresi. Aplikasi ini melaporkan apa yang ditemukan serangan tanpa mendramatisirnya: tidak ada kata "terekspos", "korban", atau ucapan selamat. Saya membangunnya sendiri dalam delapan hari pada September 2026.
Di balik layarDetail teknis untuk engineer
src/engine/tidak meng-import apa pun, termasuk React, DOM, atauDate. Setiap hasil adalah fungsi dari seed dan konfigurasi, dites terhadap implementasi rujukan brute-force.- Tidak ada
FileReader, input berkas, drag-and-drop, atau jalur tempel.tests/no-file-input.test.tsmencari API itu di bundle hasil build;tests/assessor-purity.test.tsmemastikan di level tipe dan runtime bahwa input penilai tidak punyavalues,sample, ataurows. - Serangan: linkage, homogenitas, pengetahuan latar, skewness, differencing, dan join data pendukung. Masing-masing mengembalikan
candidateCountper target. - Bangku DP: sensitivitas per kueri yang diturunkan (count 1, sum sebesar rentang clamp-nya), mekanisme Laplace dan Gaussian, serta meteran anggaran sekuensial.
dp.test.tsmencocokkan sampel Laplace dengan densitas analitiknya. - Pencarian lattice memangkas ke atas berdasarkan monotonisitas dan mencatat
prunedByserta urutan ujiorder;lattice.test.tsmemastikan hasilnya sama dengan pencarian menyeluruh. - Field memakai Canvas 2D, tiga typed array paralel, indeks grid untuk hit testing dengan satu listener, dan penataan yang deterministik.
tests/performance.test.tsmemastikan jalur 200.000 record selesai di bawah 2 detik. - Metode Sweeney dan Golle sama-sama direkonstruksi pada populasi yang kebenarannya diketahui, dan selisih 87% dan 63% ditampilkan sebagai soal yang belum terjawab.
- Seed, parameter generator, vektor generalisasi, target k, dan ε disimpan di URL. Progres kasus dan tema tetap lokal.
- Dua dependensi runtime, React 18.3 dan React DOM. Vite 5.4 dengan plugin internal
linkage-metadata, CSS biasa, animasirequestAnimationFramebuatan sendiri, tanpa library grafik atau UI. scripts/bundle-budget.mjsmenggagalkan CI di atas 250 KB gzip; ukuran saat ini 113,8 KB, termasuk 44,3 KB untuk React.- 328 tes di 20 berkas (sekitar 24 detik), 18 view ditambah 6 layar kasus, 30 modul engine.
- Sekitar 13.300 baris di
src/dan 80 commit dari 4 sampai 11 September 2026, berpasangan dengan Claude Code.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.