English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

ospite
1 / ?
torna alle lezioni

Cosa Rende Recuperabile un Formato di Archiviazione

Quattro formati di archiviazione, ordinati per recuperabilità:

FormatoRecuperabile?EsempioMetodo di Recupero
Testo in chiaropassword: hunter2Leggi il file
Base64cGFzc3dvcmQ=base64 --decode
Cifrario reversibile (AES)ENC[AES256:...]Decrittografa con la chiave
Hash one-way (bcrypt)No$2b$12$...Non può essere invertito; richiede brute-force

Testo in chiaro, base64 e cifrario reversibile: tutti recuperabili. Un singolo dump del database delle credenziali fornisce a un attaccante tutte le password in chiaro, per tutti gli utenti, simultaneamente. Una violazione; esposizione totale.

L'esempio di Mailman 2.x

Mailman 2.x (GNU mailing list manager): memorizzava le password degli iscritti in testo in chiaro. Email mensile di promemoria password: inviava a tutti gli iscritti la loro password in chiaro. Due difetti separati, entrambi MOAD-0006:

1. Memorizzazione: testo in chiaro nel database della lista. Un compromesso del server espone tutte le password degli iscritti.

2. Trasmissione: l'email mensile invia la password in chiaro via SMTP al server di posta dell'iscritto. L'email viaggia in chiaro attraverso più hop SMTP.

Il team di Mailman ha progettato entrambi i comportamenti. Il recupero era la funzionalità: gli abbonati potevano recuperare le password dimenticate. Il nome Glass Safe deriva da questo: la cassaforte contiene le credenziali in forma visibile. Chiunque raggiunga la cassaforte può leggere tutti i contenuti contemporaneamente.

Il Principio del Già-Rubato

Una credenziale memorizzata in forma recuperabile è una credenziale già rubata. L'attaccante non è ancora arrivato. La violazione non è ancora avvenuta. Ma l'architettura garantisce: quando si verifica una violazione, tutte le credenziali cadono simultaneamente. Nessuna violazione avviene in isolamento; ogni credenziale nella memoria recuperabile viene trasferita all'attaccante nella stessa operazione.

MOAD-0006 vs MOAD-0004

MOAD-0004 (Segreto Registrato): credenziali scritte nei log accidentalmente. La scrittura nel log non era l'intento; era un effetto collaterale dell'abilitazione della registrazione degli header per il debug.

MOAD-0006 (Glass Safe): credenziali memorizzate in forma recuperabile per progettazione. Il recupero era l'intento. La funzionalità di promemoria password richiedeva la memorizzazione della password. La funzionalità di visualizzazione password richiedeva la sua memorizzazione. L'impegno architetturale verso il recupero ha creato il difetto.

Distinzione in una riga: MOAD-0004 inserisce le credenziali nei log per errore; MOAD-0006 memorizza le credenziali in forma recuperabile di proposito. Le correzioni operano a livelli diversi.

Strutturale vs Accidentale

La distinzione architettonica tra MOAD-0006 e MOAD-0004 determina la strategia di correzione. Una scrittura accidentale nei log: correggere il livello di serializzazione. Un archivio progettato per il recupero: riprogettare la funzionalità che richiedeva il recupero.

Perché una Glass Safe è strutturalmente diversa da MOAD-0004? Una riga descrive ogni difetto. Cosa significa per la correzione?

Perché bcrypt Funziona

Una funzione hash unidirezionale accetta una password e produce un digest a lunghezza fissa. Dato il digest, la password originale non può essere recuperata. Non 'difficile da recuperare': impossibile da invertire. La funzione funziona in una sola direzione.

Tre proprietà richieste per la memorizzazione delle credenziali:

1. One-way (resistenza alla preimmagine). Dato hash(password), nessun algoritmo recupera password più velocemente del brute-force. bcrypt, scrypt e argon2 soddisfano tutti questa proprietà.

2. Salt. Un valore casuale anteposto alla password prima dell'hashing. Stessa password, salt diverso, hash diverso. Scopo: sconfiggere le rainbow tables (dizionari di hash precalcolati). Senza salt: un attaccante calcola hash('password123') una sola volta e controlla tutti i 1 milione di utenti contemporaneamente. Con salt: ogni utente ha un hash unico anche per la stessa password.

3. Lento per progettazione. bcrypt accetta un fattore di lavoro. Fattore di lavoro più alto: più iterazioni, più tempo di calcolo per ogni tentativo di hash. Login: 300ms per calcolare l'hash una volta. Accettabile. Brute-force: 300ms per tentativo. A 1 miliardo di tentativi: 9,5 anni per password. Inaccettabile per un attaccante. La lentezza: una caratteristica, non un difetto.

import bcrypt

# Memorizza: hash one-way con salt
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))

# Verifica: calcola l'hash del candidato e confronta i digest
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)

# MAI memorizzata: la password in chiaro
# MAI recuperato: il testo in chiaro dall'hash
# Reimpostazione della password, non promemoria della password

Il compromesso

L'hashing unidirezionale rende impossibile il recupero della password. Un utente che dimentica la propria password non può riceverla indietro. Non può esistere un'email di promemoria della password. L'esperienza utente cambia: 'hai dimenticato la password? reimpostala.' Non è un degrado: è un confine di sicurezza. Il sistema che non può recuperare una password non può far trapelare una password.

Una violazione del database che espone hash bcrypt: tutti gli hash visibili, nessuna password visibile. Un attaccante deve forzare ogni hash individualmente, a 300 ms per tentativo, con il sale per utente che sconfigge le tabelle precalcolate. Una violazione che espone password in chiaro: esposizione totale immediata.

La crittografia forte non è sufficiente

Un audit di sicurezza identifica un sistema di archiviazione delle credenziali. Le password sono archiviate utilizzando la crittografia AES-256-CBC con una chiave lato server. Il rapporto di audit lo segnala come difetto Glass Safe.

Il team di ingegneria risponde: 'AES-256 è il cifrario simmetrico più forte disponibile. La chiave risiede in un modulo di sicurezza hardware. Nessun attaccante può decriptare queste password.'

Perché questo rimane MOAD-0006 anche con una crittografia forte? Qual è la correzione corretta?