Base64 non è crittografia: la differenza fra codifica, hash e cifratura
Un testo come cGFzc3dvcmQxMjM= sembra incomprensibile, e infatti molti lo scambiano per un segreto ben protetto. In realtà è Base64: una semplice codifica che chiunque può invertire in un secondo, senza chiavi né password. Confondere codifica e crittografia è uno degli errori più comuni, e l'origine di molte fughe di dati.
Tre cose diverse che si confondono
| Cosa | A cosa serve | Si può invertire? | Serve una chiave? |
|---|---|---|---|
| Codifica (Base64, esadecimale) | rappresentare dati in un formato diverso, per esempio trasformare byte binari in testo | sì, da chiunque | no |
| Hash (SHA-256, bcrypt) | ottenere un'impronta di lunghezza fissa, per verificare integrità o password | no (si può solo confrontare) | no |
| Cifratura (AES, ChaCha20) | rendere i dati illeggibili a chi non ha la chiave | sì, ma solo con la chiave giusta | sì |
Base64 nasce per un'esigenza pratica: molti sistemi (email, JSON, intestazioni HTTP) gestiscono bene solo testo, e Base64 permette di infilarci dentro qualsiasi dato, anche binario, usando 64 caratteri «sicuri». Non nasconde nulla: cambia solo l'aspetto.
Un esempio concreto
Prova a decodificare la stringa di prima da una shell Linux:
$ echo 'cGFzc3dvcmQxMjM=' | base64 -d
password123
Nessuna chiave, nessuna fatica: il segreto era in chiaro fin dall'inizio. Lo stesso vale per l'esadecimale, per il cifrario di Cesare (che sposta ogni lettera di un numero fisso) e per le catene di codifiche una sull'altra: sembrano più complicate, ma si smontano strato dopo strato senza alcuna chiave.
Non è un caso teorico. L'autenticazione HTTP «Basic» invia nome utente e password codificati in Base64, perciò va usata solo su connessioni cifrate (HTTPS). I Secret di Kubernetes sono per impostazione predefinita solo codificati in Base64, quindi chi li legge ottiene i valori in chiaro se non è attiva anche la cifratura a riposo. E nei file di configurazione si trovano spesso «password offuscate» che sono semplice Base64.
Come ci si difende
- Non trattare mai una codifica come una protezione. Se un dato è segreto, va cifrato o, se serve solo verificarlo, trasformato in hash.
- Per le password usa hash lenti e salati (Argon2id, bcrypt, scrypt): non devono poter essere invertite, solo confrontate.
- Per i dati che devi poter rileggere usa cifratura vera, con algoritmi standard (AES-GCM, ChaCha20-Poly1305) e librerie collaudate. Non inventare mai un cifrario fatto in casa.
- Proteggi le chiavi: la cifratura è sicura quanto la chiave. Tienile in un gestore di segreti o in un modulo hardware, mai nel codice o nello stesso posto dei dati cifrati.
- Cifra il trasporto: HTTPS ovunque, perché ciò che viaggia in Base64 su una rete aperta è leggibile da chiunque la intercetti.
- Cerca i segreti dimenticati nei repository e nei file di configurazione, anche quando sembrano illeggibili: se è Base64, è leggibile.
Riconoscere una codifica a colpo d'occhio è una competenza utile sia a chi difende sia a chi gareggia nelle CTF: Base64 ha di solito lettere, cifre, + e /, e spesso termina con uno o due = di riempimento.