TL;DR
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 e un pas de rutină 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 validarea câmpurilor din 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 face parte din datele 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 o țintă pentru scurgeri de date
- 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 nicio cerere.
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 inventat, 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 Județeană / SPV.
- Valabilitatea legală. Deși rar, un CNP poate fi anulat (erori administrative, schimbare de identitate). Doar evidența populației cunoaște situația actuală.
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 tot ce nu e cifră.
- Confuzie 0 / O sau 1 / l — CNP-ul conține doar cifre; dacă ai „O” mare sau „l” mic, e greșit.
- Cifre inversate — 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 construit special pentru demonstrație. În realitate, dacă ai tastat corect un CNP existent, cifra de control rezultată 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 | Galați | 33 | Suceava | ||
| 02 | Arad | 18 | Gorj | 34 | Teleorman | ||
| 03 | Argeș | 19 | Harghita | 35 | Timiș | ||
| 04 | Bacău | 20 | Hunedoara | 36 | Tulcea | ||
| 05 | Bihor | 21 | Ialomița | 37 | Vaslui | ||
| 06 | Bistrița-Năsăud | 22 | Iași | 38 | Vâlcea | ||
| 07 | Botoșani | 23 | Ilfov | 39 | Vrancea | ||
| 08 | Brașov | 24 | Maramureș | 40 | București | ||
| 09 | Brăila | 25 | Mehedinți | 41 | București S1 | ||
| 10 | Buzău | 26 | Mureș | 42 | București S2 | ||
| 11 | Caraș-Severin | 27 | Neamț | 43 | București S3 | ||
| 12 | Cluj | 28 | Olt | 44 | București S4 | ||
| 13 | Constanța | 29 | Prahova | 45 | București S5 | ||
| 14 | Covasna | 30 | Satu Mare | 46 | București S6 | ||
| 15 | Dâmbovița | 31 | Sălaj | 47 | București S7 (desființat) | ||
| 16 | Dolj | 32 | Sibiu | 48 | București S8 (desființat) | ||
| 51 | Călărași | ||||||
| 52 | Giurgiu |
Codurile 47 și 48 aparțin fostelor sectoare 7 și 8 ale Bucureștiului (desființate) și apar doar în CNP-uri vechi. Călărași (51) și Giurgiu (52), județe înființate în 1981, au primit coduri în afara ordinii alfabetice.
Ce faci dacă întâmpini o problemă
- CNP-ul tastat nu validează — verifică-l din nou, cifră cu cifră. MOD 11 detectează majoritatea erorilor, dar cea mai frecventă cauză e o cifră lipsă sau dublată. Copiază-l direct dintr-un document oficial, în loc să-l tastezi de mână.
- Data din CNP e imposibilă (ex: 31 februarie) — fie CNP-ul a fost emis greșit, fie e inventat. Î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ă tabelul de mai sus. Codurile valide sunt 01–48, 51 și 52; orice altceva (00, 49, 50, peste 52) înseamnă o 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.
- Validarea trece, dar persoana spune că CNP-ul e greșit — algoritmul MOD 11 nu ține cont de existența reală a titularului. Un CNP poate fi valid matematic, dar să nu corespundă nimănui (inventat) sau să fie al altei persoane (transpoziție de cifre care produce tot un număr valid). Singura confirmare sigură rămâne verificarea cărții de identitate.
- Ai nevoie de verificare oficială a existenței CNP-ului — validarea locală nu poate face asta. Roagă persoana să-ți arate cartea de identitate sau confirmă prin verificarea calității de asigurat pe siui.casan.ro, care afișează un 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 e cel mai apropiat lucru de o dovadă publică a existenței 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ă duplicatele și inconsistențele; e o verificare oficială.
- Verificare identitate cu act fizic — pentru contract de muncă, credit, contracte notariale: e obligatorie CI originală.
- Compararea datei cu vârsta declarată — o verificare simplă: 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 introducerea î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, validarea client-side îmbunătățește UX-ul și reduce apelurile back-end eșuate.
- La compararea cu alte date — vârstă, județ de emitere, gen: dacă CNP-ul spune altceva decât declarațiile persoanei, ai un indicator de atenție.
- La un audit de date — când cureți o bază de date cu CNP-uri, validarea în lot identifică înregistrările corupte înainte de o migrare.
- Înainte de raportări GDPR — dacă știi ce CNP-uri din baza ta sunt valide, îți faci mai ușor inventarul datelor 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 actuală, 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ă trece verificarea algoritmului.
FAQ
Întrebări frecvente
Nu ai găsit răspunsul? Scrie-ne și vedem dacă putem adăuga un ghid.
contact@everifica.ro