Tag: cryptography, encryption, hashing, symmetric, asymmetric, pki, salt, tls
Livello: base
TL;DR: Fondamenti di sicurezza per proteggere l'integrita' e la riservatezza dei dati. Include crittografia simmetrica/asimmetrica, hashing sicuro e protezione in transito/riposo.
Crittografia simmetrica: usa la stessa chiave per cifrare e decifrare. Algoritmo di riferimento: AES. Molto veloce.
Crittografia asimmetrica: usa una chiave pubblica per cifrare e una privata per decifrare. Algoritmo di riferimento: RSA. Piu' lenta.
Hashing: funzione matematica unidirezionale (non reversibile) che produce un output a lunghezza fissa da un input di dimensione variabile. Algoritmo standard: SHA-256.
Salt: stringa casuale aggiunta a una password prima dell'hashing. Invalida gli attacchi basati su rainbow table.
Firma digitale: hash di un documento cifrato con la chiave privata del mittente. Garantisce autenticita' e integrita'.
PKI (Public Key Infrastructure): sistema per emettere, gestire e revocare i certificati digitali (X.509) e le chiavi pubbliche.
Dati in transito: dati in viaggio sulla rete, tipicamente protetti dal protocollo TLS/HTTPS.
Dati a riposo: dati archiviati su disco o database, protetti solitamente con crittografia simmetrica.
Q: Qual e' la differenza principale tra hashing e crittografia?R: La crittografia e' reversibile tramite una chiave, serve a nascondere un dato per poi recuperarlo. L'hashing e' unidirezionale e serve solo a verificare l'integrita' o confrontare password.
Q: Come gestisci il salvataggio delle password nel database?R: Non le salvo mai in chiaro o cifrate. Uso sempre un algoritmo di hashing con key derivation (come bcrypt o Argon2) combinato con un salt univoco per ogni utente.
Q: Spiega come funziona l'handshake in HTTPS.R: Il client e il server usano la crittografia asimmetrica (certificati) per autenticarsi in modo sicuro e concordare una chiave di sessione condivisa. Poi passano alla crittografia simmetrica per i dati.
Creare algoritmi di crittografia proprietari ("roll your own crypto") invece di usare librerie standard di settore verificate.
Usare MD5 o SHA-1 per l'hashing (sono deprecati e vulnerabili alle collisioni).
Non utilizzare un salt, rendendo gli hash vulnerabili ad attacchi a dizionario o rainbow table.
Hardcodare le chiavi di cifratura nel codice sorgente o esporle nei repository di controllo versione.
Usare la crittografia asimmetrica per cifrare grandi moli di dati (e' troppo lenta e ha limiti di dimensione del payload).
// Esempio pratico di hashing sicuro con Node.js e bcrypt
const bcrypt = require('bcrypt');
const saltRounds = 12;
// Registrazione: Generazione hash da salvare nel DB
const plainPassword = 'super_secret_password';
const hash = await bcrypt.hash(plainPassword, saltRounds);
// Login: Verifica password utente contro hash nel DB
const isMatch = await bcrypt.compare('super_secret_password', hash);
if (isMatch) {
// Autenticazione riuscita
}
[ ] Dettagli sull'algoritmo Diffie-Hellman per lo scambio sicuro delle chiavi
[x] Differenza tra bcrypt e il generico SHA-256
OWASP Cryptographic Storage Cheat Sheet
OWASP Password Storage Cheat Sheet