francescomargiotta.com
  • 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».

di Francesco Margiotta Casaluci7 min di lettura

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.

ParteLunghezzaContenuto
Codice paese2Due lettere ISO 3166-1 (IT, DE, FR…)
Cifre di controllo2Checksum MOD-97 su tutto il resto
BBANvariabileIl 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 conto
L'IBAN di esempio per l'Italia del registro SWIFT, scomposto. 2 + 2 + 1 + 5 + 5 + 12 = 27 caratteri.

L'algoritmo MOD-97

La verifica delle due cifre di controllo è definita da ISO 7064 ed è la stessa per tutti i paesi. Il procedimento è meccanico:

  1. Togliete spazi e portate tutto in maiuscolo.
  2. Spostate i primi quattro caratteri (paese + cifre di controllo) in fondo alla stringa.
  3. Sostituite ogni lettera con un numero: A vale 10, B vale 11, fino a Z che vale 35.
  4. Interpretate il risultato come un unico grande numero intero e calcolatene il resto della divisione per 97.
  5. 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;
}
Il resto non supera mai 97 × 10 + 9, quindi resta comodamente in un intero normale.

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.

PosizioniContenuto
1–7Numero progressivo attribuito al contribuente
8–10Codice dell'ufficio provinciale dell'Agenzia delle Entrate
11Cifra di controllo

La cifra di controllo si calcola con una variante dell'algoritmo di Luhn, lo stesso schema usato per le carte di credito:

  1. Le cifre in posizione dispari (la prima, la terza, la quinta…) si sommano così come sono.
  2. Le cifre in posizione pari si raddoppiano; se il risultato supera 9, gli si sottrae 9 (equivalente a sommare le due cifre del risultato).
  3. Si somma tutto, compresa l'undicesima cifra.
  4. 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;
12345678903 supera il controllo; 12345678901 no.

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:

  1. Normalizzate spazi e maiuscole. Gli IBAN vengono quasi sempre incollati nel formato a gruppi di quattro caratteri, ed è giusto accettarli così.
  2. Controllate la forma: due lettere, due cifre, poi caratteri alfanumerici per l'IBAN; esattamente undici cifre per la partita IVA.
  3. Controllate la lunghezza attesa per il paese dell'IBAN. Un errore qui è definitivo e costa una singola lettura in tabella.
  4. 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.
  5. 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

Articoli correlati