🔒 Validarea se face exclusiv în browserul tău. CNP-ul nu este trimis pe niciun server — algoritmul rulează local.
De ce validezi un CNP
Validarea CNP-ului este un pas rutinier pentru:
- Angajatori care verifică formularele de HR înainte de a le introduce în REVISAL
- Contabili care procesează declarații și fișe fiscale
- Dezvoltatori de software care scriu validare input în formulare web
- Persoane fizice care vor să confirme că au copiat corect CNP-ul într-un formular important
Într-un minut, validarea locală confirmă: formatul (13 cifre), structura (gen, dată, județ) și că checksum-ul MOD 11 trece — adică CNP-ul a fost introdus corect, fără greșeli de tastare.
De ce NU trimitem CNP-ul pe server
CNP-ul este date cu caracter personal (PII) în sensul GDPR. Trimiterea lui către un server terț pentru „validare” este:
- Inutilă — algoritmul MOD 11 este public și se poate rula în browser în milisecunde
- Riscantă — orice serviciu care primește CNP-uri devine țintă pentru breach-uri
- Problematică legal — creează obligații GDPR (log-uri, ștergere, consimțământ)
Soluția corectă, aplicată aici: JavaScript client-side. Codul de validare rulează integral în browserul tău. Nu există backend, nu există bază de date, nu există log-uri. Poți verifica singur în DevTools → Network: apasă Validează și nu vei vedea niciun request.
Structura unui CNP
| Poziție | Lungime | Conținut | Exemplu |
|---|---|---|---|
| 1 | 1 | Gen și secol (S) | 2 (femeie 1900-1999) |
| 2-3 | 2 | An naștere (AA) | 85 |
| 4-5 | 2 | Lună (LL) | 03 |
| 6-7 | 2 | Zi (ZZ) | 14 |
| 8-9 | 2 | Cod județ (JJ) | 41 (București Sector 1) |
| 10-12 | 3 | Ordinal secvențial | 048 |
| 13 | 1 | Checksum MOD 11 | 7 |
Cifra de gen / secol (S)
| S | Gen | Secol |
|---|---|---|
| 1 | M | 1900-1999 |
| 2 | F | 1900-1999 |
| 3 | M | 1800-1899 |
| 4 | F | 1800-1899 |
| 5 | M | 2000-2099 |
| 6 | F | 2000-2099 |
| 7 | M | Străin rezident |
| 8 | F | Străin rezident |
| 9 | — | Străin (non-rezident) |
Algoritmul de checksum
Se aplică secvența de ponderi 2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9 asupra primelor 12 cifre:
suma = 2·d1 + 7·d2 + 9·d3 + 1·d4 + 4·d5 + 6·d6
+ 3·d7 + 5·d8 + 8·d9 + 2·d10 + 7·d11 + 9·d12
rest = suma mod 11
cifra_control = (rest == 10) ? 1 : rest
Dacă cifra_control corespunde cu a 13-a cifră din CNP, checksum-ul este valid.
Ce NU confirmă validarea
- Existența titularului. Un CNP valid structural poate fi fabricat artificial cu orice combinație de dată, județ și ordinal care satisface MOD 11.
- Identitatea persoanei. Pentru asta e nevoie de actul de identitate fizic sau de o verificare prin Casa Judeteană / SPV.
- Valabilitatea legală. Deși rar, CNP-uri pot fi anulate (erori administrative, schimbare de identitate). Doar evidența populației știe statusul curent.
Pentru verificări cu consecințe reale (contract de muncă, credit bancar, identificare fiscală) combină validarea locală cu:
- Verificarea calității de asigurat CNAS pe verificare-asigurat-cnas — confirmi că persoana este în sistemul de sănătate
- Cartea de identitate fizică, verificată în persoană
- Verificarea angajatorului prin REVISAL (pentru contracte de muncă)
Cazuri frecvente de erori
- CNP lipit dintr-un PDF — uneori apar caractere invizibile (U+200B zero-width space). Instrumentul elimină automat non-cifrele.
- Confuzie 0 / O sau 1 / l — CNP-ul conține doar cifre; dacă ai „O” mare sau „l” mic, e greșit.
- Inversare de cifre — cea mai frecventă eroare. MOD 11 detectează 98% din erorile simple de tastare.
- CNP cu 12 sau 14 cifre — format greșit; CNP-ul românesc are exact 13.
Exemplu complet de calcul MOD 11
Luăm CNP-ul 2850314410487 (femeie, născută 14 martie 1985, București Sector 1).
Aplicăm ponderile pe primele 12 cifre:
| Cifră | 2 | 8 | 5 | 0 | 3 | 1 | 4 | 4 | 1 | 0 | 4 | 8 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pondere | 2 | 7 | 9 | 1 | 4 | 6 | 3 | 5 | 8 | 2 | 7 | 9 |
| Produs | 4 | 56 | 45 | 0 | 12 | 6 | 12 | 20 | 8 | 0 | 28 | 72 |
Suma: 4 + 56 + 45 + 0 + 12 + 6 + 12 + 20 + 8 + 0 + 28 + 72 = 263.
Restul împărțirii la 11: 263 mod 11 = 10. Regula specială: când restul e 10, cifra de control devine 1.
Dar CNP-ul nostru are cifra a 13-a 7, nu 1 — deci exemplul e invalid matematic, a fost fabricat pentru demonstrație. În realitate, dacă ai tastat corect un CNP existent, restul dă o valoare care coincide cu ultima cifră. Dacă nu, ai o greșeală de tastare.
Codurile de județ (pozițiile 8-9)
| Cod | Județ | Cod | Județ | Cod | Județ | ||
|---|---|---|---|---|---|---|---|
| 01 | Alba | 17 | Brăila | 33 | Suceava | ||
| 02 | Arad | 18 | Buzău | 34 | Teleorman | ||
| 03 | Argeș | 19 | Caraș-Severin | 35 | Timiș | ||
| 04 | Bacău | 20 | Cluj | 36 | Tulcea | ||
| 05 | Bihor | 21 | Constanța | 37 | Vaslui | ||
| 06 | Bistrița-Năsăud | 22 | Covasna | 38 | Vâlcea | ||
| 07 | Botoșani | 23 | Dâmbovița | 39 | Vrancea | ||
| 08 | Brașov | 24 | Dolj | 40 | București (gen.) | ||
| 09 | București (vechi) | 25 | Galați | 41 | București S1 | ||
| 10 | Buzău (istoric) | 26 | Gorj | 42 | București S2 | ||
| 11 | Caraș-Severin (ist.) | 27 | Harghita | 43 | București S3 | ||
| 12 | Cluj (istoric) | 28 | Hunedoara | 44 | București S4 | ||
| 13 | Constanța (istoric) | 29 | Ialomița | 45 | București S5 | ||
| 14 | Covasna (istoric) | 30 | Iași | 46 | București S6 | ||
| 15 | Dâmbovița (istoric) | 31 | Maramureș | 47 | Călărași | ||
| 16 | Dolj (istoric) | 32 | Mehedinți | 48 | Giurgiu | ||
| 51-52 | Coduri speciale |
Codurile 09-16 sunt istorice (emise înainte de 1979) și apar rar azi. 51-52 au fost folosite pentru cetățeni străini sau situații administrative particulare.
Ce faci dacă întâmpini o problemă
- CNP-ul tastat nu validează — verifică dublu cifră cu cifră. MOD 11 detectează majoritatea erorilor, dar cea mai frecventă cauză e o cifră lipsă sau dublă. Copiază-paste direct din document oficial în loc de tastare manuală.
- Data din CNP e imposibilă (ex: 31 februarie) — CNP-ul are eroare la emitere sau a fost fabricat. În cazuri foarte rare, CNP-uri istorice cu date aparent invalide sunt reale (erori de înregistrare necorectate); confirmă cu persoana în cauză.
- Codul de județ nu e recunoscut — verifică tabela de mai sus. Codurile 09-16 sunt istorice, 51-52 speciale; orice altceva înseamnă eroare.
- Cifra de gen / secol e neașteptată — dacă tastezi un CNP al unui adult și obții S=5 sau S=6 (născut 2000+), probabil ai o cifră greșită la început. Invers: pentru un copil născut în 2020, S trebuie să fie 5 sau 6, nu 1/2.
- Validare aparent corectă dar persoana spune că e greșit — algoritmul MOD 11 nu ia în considerare existența reală a titularului. Un CNP poate fi matematic valid dar să nu corespundă nimănui (fabricat) sau să fie al altei persoane (transpoziție de cifre care produce tot un număr valid). Confirmarea fizică cu CI rămâne unica soluție definitivă.
- Ai nevoie de verificare oficială a existenței CNP-ului — validarea locală nu poate face asta. Solicită persoanei fizice să-ți arate cartea de identitate sau confirmă prin verificarea calității de asigurat pe siui.casan.ro, care întoarce rezultat doar dacă CNP-ul există în evidența CNAS.
Alternative și verificări complementare
- Validatoare open-source JavaScript —
iulianu/cnp,aciobanitei/js-romanian-cnp-validation— pentru dezvoltatori care vor să integreze logică identică în propria aplicație. - Verificare CNAS — verificare-asigurat-cnas este cea mai apropiată dovadă publică de existență a unui CNP; dacă CNAS returnează informații (statut asigurat), CNP-ul corespunde unei persoane reale.
- Verificare documente la REVISAL — pentru angajatori, introducerea CNP-ului în REVISAL detectează duplicate și inconsistente; e verificare oficială.
- Verificare identitate cu act fizic — pentru contract de muncă, credit, contracte notariale: obligatoriu CI fizică originală.
- Validare dată împotriva vârstei declarate — simplu cross-check: data extrasă din CNP trebuie să corespundă cu vârsta/data nașterii declarate de persoană. Discrepanțele indică fie tastare greșită, fie identitate falsă.
Când merită să validezi un CNP
- La completarea oricărui formular HR / fiscal / bancar — un CNP greșit blochează procesarea; validarea locală prinde eroarea înainte de trimitere.
- Înainte de introducere în REVISAL / ReviSal — evită respingerea declarației și timpul pierdut cu corectarea.
- La colectarea datelor pentru contracte — orice contract semnat cu CNP eronat poate fi contestat ulterior; validarea e o verificare de 5 secunde.
- Pentru dezvoltatori — în orice formular web care colectează CNP, validare client-side îmbunătățește UX-ul și reduce apelurile back-end eșuate.
- La cross-check împotriva altor date — vârstă, județ de emitere, gen: dacă CNP-ul spune altceva decât declarațiile persoanei, ai un indicator de atenție.
- În audit de date — la curățarea unei baze de date cu CNP-uri, rularea validării în batch identifică înregistrările corupte înainte de o migrare.
- Înainte de raportări GDPR — știind ce CNP-uri sunt valide în baza ta te ajută la inventarul de date personale protejate.
Introdu CNP-ul în câmpul de validare
CNP-ul românesc are exact 13 cifre. Poate fi introdus continuu sau cu spații — instrumentul elimină automat caracterele non-numerice.
Apasă Validează CNP
Algoritmul rulează local în browser, fără apel de rețea. Rezultatul apare instant.
Citește structura decodată
Vezi genul (M / F / străin), data nașterii, vârsta curentă, județul de emitere și dacă CNP-ul trece verificarea MOD 11.
Înțelege ce confirmă și ce NU confirmă
Checksum valid = CNP-ul este matematic corect. NU înseamnă că există o persoană reală cu acel CNP — doar că algoritmul trece.
FAQ
Întrebări frecvente
Nu ai găsit răspunsul? Scrie-ne și evaluăm adăugarea ghidului.
contact@everifica.ro