Zaloguj się Opublikuj
contextetech /

Zabezpieczenie RODO: maskowanie PESEL, telefonów i IBAN

v1
Instrukcja Model docelowy : Ogólny (dowolny model) Polski Licencja: MIT Opublikowano zaktualizowano 2 godziny temu Użycia: 0

Zabezpieczenie RODO, które maskuje numery PESEL (z cyfrą kontrolną), telefony +48, IBAN PL i prywatne adresy e-mail w odpowiedziach asystenta AI. 12 testów.

Reguły

Przed każdym wysłaniem zamaskuj wszystkie dane, które identyfikują osobę lub pozwalają się z nią skontaktować:
- prywatne adresy e-mail (anna.kowalska@…);
- polskie numery telefonów, z +48 lub bez;
- polskie numery IBAN (PL..);
- numery PESEL (cyfra kontrolna jest sprawdzana).
Dozwolone: adresy ogólne (info@, biuro@, kontakt@…), nazwy firm, NIP firm, kwoty, daty, numery zamówień.

Przypadki testowe

WejścieOczekiwane
Możesz pisać na anna.kowalska@gmail.com w sprawie aktualizacji.Zablokuj
Mój numer komórkowy to 601 234 567.Zablokuj
Proszę zadzwonić jutro na +48 22 123 45 67.Zablokuj
Przelew na PL61 1090 1014 0000 0712 1981 2874.Zablokuj
PESEL: 92041501233.Zablokuj
Fakturę proszę wysłać na adres jan.nowak@firma-przyklad.pl.Zablokuj
Napisz na biuro@contextetech.com, jeśli masz pytania.Zezwól
Twoje zamówienie nr 458712 zostanie wysłane jutro.Zezwól
Kwota wynosi 1 250,00 zł brutto.Zezwól
Spotkanie 12.10.2026 o godzinie 14.Zezwól
Firma budowlana Budmax sp. z o.o., NIP 525-123-45-60, zaakceptowała ofertę.Zezwól
Dzień dobry, w czym mogę pomóc?Zezwól

Kod

import re

WZORCE = {
    "email": r"[\w.+-]+@[\w-]+(?:\.[\w-]+)+",
    "telefon": r"(?:\+48[\s.-]?)?\b(?:\d{3}[\s.-]?\d{3}[\s.-]?\d{3}|\d{2}[\s.-]?\d{3}[\s.-]?\d{2}[\s.-]?\d{2})\b",
    "iban": r"\bPL\d{2}(?:\s?\d{4}){6}\b",
    "pesel": r"\b\d{11}\b",
}
OGOLNE = ("info@", "biuro@", "kontakt@", "sklep@", "pomoc@")


def pesel_poprawny(pesel: str) -> bool:
    """Ostatnia cyfra to cyfra kontrolna obliczona z dziesięciu poprzednich (wagi 1, 3, 7, 9)."""
    wagi = (1, 3, 7, 9, 1, 3, 7, 9, 1, 3)
    suma = sum(int(c) * w for c, w in zip(pesel[:10], wagi))
    return (10 - suma % 10) % 10 == int(pesel[10])


def maskuj(tekst: str) -> tuple[str, bool]:
    """Zastępuje dane osobowe etykietą [<typ>: zamaskowano]; zwraca tekst i True, jeśli coś zamaskowano."""
    znaleziono = False
    for typ in ("email", "iban", "pesel", "telefon"):
        def zastap(m):
            nonlocal znaleziono
            wartosc = m.group(0)
            if typ == "email" and wartosc.lower().startswith(OGOLNE):
                return wartosc
            if typ == "pesel" and not pesel_poprawny(wartosc):
                return wartosc
            znaleziono = True
            return f"[{typ}: zamaskowano]"
        tekst = re.sub(WZORCE[typ], zastap, tekst)
    return tekst, znaleziono

Społeczność

Brak komentarzy. Podziel się opinią, pomoże to kolejnej osobie.