Microsoft Presidio este un SDK open-source pentru detectarea și anonimizarea datelor personale. AnalyzerEngine găsește entități (nume, email, telefon, card, IBAN, IP etc.) prin tipare, verificări de checksum, context și modele NLP; AnonymizerEngine le transformă cu operatori precum replace, redact, mask, hash, encrypt, keep sau custom.
În configurația implicită Presidio are recunoaștere și modele doar pentru engleză. Lista oficială de entități are tipuri globale și tipuri pe țări (SUA, Marea Britanie, Spania, Italia, Polonia, India, Germania etc.), dar nu are entități pentru România: un CNP trebuie adăugat cu un PatternRecognizer propriu, iar pentru textul românesc trebuie configurat un model NLP pentru limba română.
Un flux uzual: textul utilizatorului trece prin Presidio înainte de apelul la model, iar datele sunt înlocuite sau criptate. Operatorul encrypt este reversibil: DeanonymizeEngine cu operatorul decrypt și aceeași cheie reface valorile originale, de exemplu pentru afișarea către un utilizator autorizat. Trimiterea datelor personale către un furnizor extern rămâne o prelucrare supusă GDPR, chiar și cu anonimizare parțială.
Concepte cheie și caracteristici
| Concept / Parametru | Descriere practică |
|---|---|
AnalyzerEngine().analyze(text, language) |
Întoarce entitățile găsite, cu tip, poziție și scor. |
AnonymizerEngine().anonymize(text, analyzer_results, operators) |
Aplică operatorii; fără operator specificat se folosește replace cu <TIP_ENTITATE>. |
replace / redact / mask |
Înlocuiește cu o valoare, elimină complet sau maschează cu un caracter (masking_char, chars_to_mask). |
hash |
Hash cu sare (sha256 implicit, sau sha512). |
encrypt / decrypt |
Criptare reversibilă cu cheie; DeanonymizeEngine face decriptarea. |
PatternRecognizer |
Recunoaștere proprie pe bază de expresii regulate sau listă de cuvinte; se adaugă cu analyzer.registry.add_recognizer(). |
Exemple practice și scenarii reale
Exemplul 1: Recunoaștere proprie pentru CNP
Tipar simplificat pentru 13 cifre cu lună și zi valide, fără verificarea cifrei de control. RO_CNP este un nume ales de tine, nu o entitate Presidio.
from presidio_analyzer import AnalyzerEngine, Pattern, PatternRecognizer
cnp = PatternRecognizer(
supported_entity="RO_CNP",
patterns=[Pattern(
name="cnp",
regex=r"\b[1-9]\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{6}\b",
score=0.6,
)],
)
analyzer = AnalyzerEngine()
analyzer.registry.add_recognizer(cnp)
Exemplul 2: Mascarea parțială a unui număr de card
from presidio_anonymizer.entities import OperatorConfig
anonymizer.anonymize(
text=text,
analyzer_results=rezultate,
operators={"CREDIT_CARD": OperatorConfig(
"mask", {"masking_char": "*", "chars_to_mask": 12, "from_end": False})},
)
Exemplul 3: Criptare reversibilă
from presidio_anonymizer import DeanonymizeEngine
from presidio_anonymizer.entities import OperatorConfig
anonimizat = anonymizer.anonymize(
text=text, analyzer_results=rezultate,
operators={"DEFAULT": OperatorConfig("encrypt", {"key": CHEIE})})
original = DeanonymizeEngine().deanonymize(
text=anonimizat.text, entities=anonimizat.items,
operators={"DEFAULT": OperatorConfig("decrypt", {"key": CHEIE})})
Greșeli frecvente și capcane
- Aștepți ca Presidio să recunoască singur CNP-ul sau seria de buletin. Nu există entități românești în lista oficială; adaugă recunoașteri proprii și testează-le.
- Rulezi analiza cu
language="en"pe text în română și te bazezi pe detecția numelor. Modelul NLP implicit este pentru engleză; configurează unul pentru română sau verifică rezultatele. - Păstrezi cheia de criptare în același loc cu datele anonimizate. Cu cheia,
encryptnu mai protejează nimic.