Labs
Each lab takes under an hour on a laptop and turns a claim from this mechanism into a number you measured yourself.
- 1
Measure the cost of encryption on columnar scans
A 1% range query on 20 million Parquet rows: sorted ts, ts as a random permutation, and ts encrypted with AES and decrypted at query time.
MeasurePython with PyArrow, DuckDB and cryptography - 2
Envelope encryption and crypto-shredding in 40 lines
Encrypt 5 patients with their own data keys wrapped by a master key, time 100 MB of AES-GCM, shred one patient, then restore a backup.
MeasurePython with cryptography - 3
Show that a masked column is still searchable
Recover the three hidden digits of a masked 6-digit ID with prefix count queries, then reject predicates on the masked column.
Break itPython (SQLite) - 4
Crack a hashed phone number in seconds
Hash every 7-digit number with SHA-256, recover a hashed number by lookup, then try again with a per-record salt.
Break itPython - 5
Re-identify a "5-anonymous" table and measure the uniqueness of quasi-identifiers
100,000 fake people: how many are unique on birth date, postcode and sex, and what k two 5-anonymous releases reach once joined.
Break itPython with pandas - 6
Differencing attack and the Laplace mechanism
Recover one salary from two exact sums, then add Laplace noise to counts and measure the error at true counts 5, 100 and 1,000,000.
Break itPython with NumPy - 7
A privacy budget ledger
A noisy count that charges epsilon to a budget of 1.0: how many of 15 queries are answered, and what averaging repeats costs.
SimulatePython with NumPy - 8
A result cache that leaks, and the fix
A result cache keyed only by query text serves north rows to a south user; keying by identity and policy fixes it and removes the timing signal.
Break itPython