- Italia
- Dati
Validare IBAN e partita IVA: come funzionano i checksum
MOD-97 per l'IBAN, Luhn per la partita IVA: due algoritmi che si calcolano offline in microsecondi. E il confine, spesso frainteso, tra «formalmente valido» ed «esistente».
IBAN e partita IVA hanno una cosa in comune: sono due stringhe che gli utenti sbagliano a digitare in continuazione, e due stringhe che possono essere verificate matematicamente prima di essere salvate. Non serve una chiamata a un servizio esterno, non serve una connessione: il controllo è aritmetica pura, si fa in qualche microsecondo e intercetta quasi tutti gli errori di battitura.
Il punto meno ovvio, e quello su cui questo articolo insiste, è il confine: cosa dimostra un checksum valido, e soprattutto cosa non dimostra. Perché la confusione tra le due cose produce bug che si scoprono solo quando un bonifico è già partito.
Com'è fatto un IBAN
IBAN sta per International Bank Account Number, standardizzato da ISO 13616. Non è un numero di conto nuovo: è un involucro standardizzato attorno al numero di conto nazionale già esistente, aggiunto per rendere i pagamenti transfrontalieri verificabili prima dell'invio.
| Parte | Lunghezza | Contenuto |
|---|---|---|
| Codice paese | 2 | Due lettere ISO 3166-1 (IT, DE, FR…) |
| Cifre di controllo | 2 | Checksum MOD-97 su tutto il resto |
| BBAN | variabile | Il numero di conto nazionale, formato deciso da ogni paese |
La lunghezza totale è fissa per paese ma diversa tra paesi: 27 caratteri per l'Italia, 22 per la Germania, 22 per il Regno Unito, 15 per la Norvegia, 31 per Malta. È la prima verifica da fare, ed è sorprendentemente efficace: un IBAN italiano di 26 o 28 caratteri è sbagliato senza bisogno di calcolare nulla.
IT60 X054 2811 1010 0000 0123 456
IT codice paese
60 cifre di controllo ISO 13616
X CIN (carattere di controllo nazionale italiano)
05428 ABI — istituto di credito
11101 CAB — sportello/filiale
000000123456 numero di contoL'algoritmo MOD-97
La verifica delle due cifre di controllo è definita da ISO 7064 ed è la stessa per tutti i paesi. Il procedimento è meccanico:
- Togliete spazi e portate tutto in maiuscolo.
- Spostate i primi quattro caratteri (paese + cifre di controllo) in fondo alla stringa.
- Sostituite ogni lettera con un numero: A vale 10, B vale 11, fino a Z che vale 35.
- Interpretate il risultato come un unico grande numero intero e calcolatene il resto della divisione per 97.
- Se il resto è 1, il checksum è corretto. Qualunque altro valore significa IBAN non valido.
Il numero che si ottiene al punto 4 ha tipicamente una trentina di cifre, quindi eccede la precisione di un intero a 64 bit. Non serve però una libreria per numeri grandi: basta calcolare il resto man mano, una cifra alla volta, sfruttando il fatto che il modulo si distribuisce sulla costruzione del numero.
/** mod-97 su una stringa numerica arbitrariamente lunga, senza BigInt. */
function mod97(numeric: string): number {
let remainder = 0;
for (let i = 0; i < numeric.length; i++) {
remainder = (remainder * 10 + (numeric.charCodeAt(i) - 48)) % 97;
}
return remainder;
}Perché proprio 97
La scelta non è arbitraria. 97 è il numero primo più grande sotto 100, e questa combinazione di primalità e dimensione dà garanzie precise: il controllo rileva sempre l'errore di una singola cifra, rileva sempre lo scambio di due cifre adiacenti — l'errore umano più frequente dopo il singolo carattere sbagliato — e lascia passare per puro caso circa un errore su 97, cioè poco più dell'uno per cento. Con due sole cifre di controllo è un rapporto costi-benefici difficile da battere.
Il CIN, il controllo italiano dentro il controllo internazionale
Negli IBAN italiani c'è una particolarità: subito dopo le cifre di controllo ISO compare una lettera, il CIN. È un carattere di controllo nazionale, precedente all'IBAN, calcolato su ABI, CAB e numero di conto con un algoritmo tutto italiano — la stessa coppia di tabelle pari/dispari usata per il carattere di controllo del codice fiscale.
La partita IVA
La partita IVA italiana è molto più semplice: undici cifre, sempre, senza lettere. La struttura è anch'essa fissa.
| Posizioni | Contenuto |
|---|---|
| 1–7 | Numero progressivo attribuito al contribuente |
| 8–10 | Codice dell'ufficio provinciale dell'Agenzia delle Entrate |
| 11 | Cifra di controllo |
La cifra di controllo si calcola con una variante dell'algoritmo di Luhn, lo stesso schema usato per le carte di credito:
- Le cifre in posizione dispari (la prima, la terza, la quinta…) si sommano così come sono.
- Le cifre in posizione pari si raddoppiano; se il risultato supera 9, gli si sottrae 9 (equivalente a sommare le due cifre del risultato).
- Si somma tutto, compresa l'undicesima cifra.
- Se il totale è un multiplo di 10, la partita IVA è formalmente valida.
let sum = 0;
for (let i = 0; i < 11; i++) {
let d = s.charCodeAt(i) - 48;
if (i % 2 === 1) { // posizioni pari, contando da 1
d *= 2;
if (d > 9) d -= 9;
}
sum += d;
}
const valida = sum % 10 === 0;Cosa un checksum valido non dimostra
Ed eccoci al punto che conta davvero. Un checksum verifica la coerenza interna di una stringa. Non ha alcun accesso al mondo reale, e quindi non può dire nulla sull'esistenza di ciò che la stringa rappresenta.
- Un IBAN con checksum valido può appartenere a un conto chiuso, a un conto mai aperto, o a una persona diversa da quella che vi aspettate.
- Una partita IVA con cifra di controllo corretta può essere cessata, mai attribuita, o appartenere a un'altra azienda.
- Il codice ABI e il CAB possono riferirsi a una filiale che non esiste più: le fusioni bancarie li rendono obsoleti senza invalidare l'IBAN.
- Nessuno dei due controlli dice nulla sulla titolarità. Il nome del beneficiario non entra in nessuno dei due calcoli.
Se serve sapere se una partita IVA è realmente attiva e a chi è intestata, l'unico strumento è il servizio VIES della Commissione Europea, che interroga le banche dati fiscali nazionali. Per l'IBAN, la verifica della titolarità avviene solo lato banca, ed è la ragione per cui i sistemi di pagamento europei hanno introdotto il controllo di corrispondenza tra nome del beneficiario e IBAN: perché il MOD-97, da solo, non poteva impedire i bonifici indirizzati alla persona sbagliata.
Come impostare la validazione
Un ordine dei controlli che funziona bene nella pratica, dal più economico al più costoso:
- Normalizzate spazi e maiuscole. Gli IBAN vengono quasi sempre incollati nel formato a gruppi di quattro caratteri, ed è giusto accettarli così.
- Controllate la forma: due lettere, due cifre, poi caratteri alfanumerici per l'IBAN; esattamente undici cifre per la partita IVA.
- Controllate la lunghezza attesa per il paese dell'IBAN. Un errore qui è definitivo e costa una singola lettura in tabella.
- Calcolate il checksum. Se fallisce, il messaggio all'utente dovrebbe dire che il codice contiene un errore di digitazione, non che il conto non esiste — sono due affermazioni molto diverse e solo la prima è vera.
- Se il dato è critico — un pagamento, una fatturazione — aggiungete una verifica esterna: VIES per la partita IVA, i controlli della banca per l'IBAN.
Il messaggio di errore merita un'ultima nota. «IBAN non valido» è tecnicamente corretto ma inutile; «l'IBAN inserito contiene un errore: controlli di averlo copiato per intero» dice all'utente cosa fare, ed è quasi sempre la verità, perché il caso di gran lunga più frequente è un carattere saltato in fase di copia.
L'autore
Francesco Margiotta Casaluci è backend engineer: progetta e sviluppa microservizi in Java e Spring Boot, pipeline dati e piattaforme cloud-native. Scrive di quello che implementa, e implementa gli strumenti gratuiti pubblicati su questo sito.
Leggi il profilo completo