@@ -346,8 +346,7 @@ class User extends AbstractITKDevEntity implements AnonymizationStatusInterface
346346` ` `
347347
348348Each PII field gets `#[ITKDev\EntityBundle\Privacy\Attribute\Anonymize(strategy: Strategy::Redact)]`. Strategies:
349- ` NullValue` , `Redact`, `Hash`, `Pseudonymize` (sha1 with a `kernel.secret`-derived pepper). The bundle scans these at
350- compile time and ships two console commands :
349+ `NullValue`, `Redact`, `Hash`, `Pseudonymize`. The bundle scans these at compile time and ships two console commands :
351350
352351- `bin/console privacy:anonymize <subjectUlid>` — right-to-erasure : scrubs PII on the subject's User row + every row
353352 that references them via a `ManyToOne(UserInterface)` association, plus rewrites the corresponding audit history.
@@ -358,6 +357,19 @@ compile time and ships two console commands:
358357
359358The mechanism is law-neutral; the same machinery applies to GDPR, CCPA, LGPD, PIPEDA, etc.
360359
360+ # ## GDPR semantics of strategies
361+
362+ Not every strategy produces anonymous data. Pick deliberately :
363+
364+ - ` NullValue` , `Redact`, `Hash` — **anonymization.** Output is unlinkable to the source value and to other rows
365+ scrubbed with the same strategy (`Hash` returns a fresh `random_bytes(32)`-derived token per call). Once applied, the
366+ resulting column is no longer personal data.
367+ - ` Pseudonymize` — **pseudonymization.** Output is a deterministic short token derived from the cleartext and
368+ ` kernel.secret` , so rows that shared a value still collide post-scrubbing. Use this when you need to preserve
369+ referential equality (e.g. correlating activity across tables) without retaining the cleartext. Under GDPR
370+ Recital 26 the result is **still personal data** — apply the same access controls as you would to the cleartext, and
371+ do not export it as "anonymized."
372+
361373# # Configuration
362374
363375Everything is optional — see the reference table below for defaults.
0 commit comments