I programmatori di siti Web dovrebbero sapere che dovrebbero mai e poi mai provare a implementare la crittografia da soli.
In particolare, ciò significa che nessun esperto non esperto in sicurezza dovrebbe toccare direttamente le primitive crittografiche. Non dovrebbero pensare a livello di AES, SHA-1, ecc. Al contrario, dovrebbero utilizzare funzioni di alto livello per crittografare e firmare messaggi e password "hash".
Perché? Perché altrimenti, le persone si ingannano nel pensare che:
- AES-256 è "ottima crittografia", nonostante lo stiano utilizzando in modalità ECB, o utilizzando valori IV non casuali, ecc. (In alcune modalità, gli IV non casuali ma unici sono accettabili. altri, non così tanto.)
- Possono utilizzare la stessa chiave simmetrica per crittografare più messaggi (o, peggio, memorizzare la chiave simmetrica nel codice per l'uso diretto).
- Potrebbero persino decidere di utilizzare una passphrase come chiave direttamente, senza utilizzare alcuna funzione di derivazione della chiave.
- Possono utilizzare RSA per crittografare i dati direttamente.
- Possono semplicemente "salare e MD5" le loro password per tenerle al sicuro. (Se pensi che le tabelle arcobaleno siano il link più debole, ripensaci .)
Solo per essere sulla stessa pagina, nessuno degli elementi sopra è ok . Se non lo ottieni, non dovresti toccare la crypto con un palo da 10 piedi! (AES-256 è ottima crittografia, ma solo se la usi correttamente. "Non è la dimensione che conta, è quello che fai con essa.": -))
Di che tipo di funzioni di alto livello sto parlando? Personalmente raccomando l'uso di una libreria OpenPGP (per i dati a riposo) o SSL (per i dati in movimento). Questi protocolli specificano rigidamente l'uso corretto di algoritmi asimmetrici, simmetrici e di hash. Ad esempio, con OpenPGP:
- Non usa RSA per crittografare i dati direttamente, ma invece genera una chiave (simmetrica) di sessione per messaggio (questo è importante) e utilizza RSA per crittografare quella chiave di sessione.
- Utilizza una funzione di derivazione della chiave per trasformare passphrase in chiavi. (Nel linguaggio di OpenPGP, si chiama S2K, ma penso che "la funzione di derivazione della chiave" sia il termine più standard.)
- Gestisce il picking di una buona modalità, quindi non finirai mai con l'uso di ECB.
- Gestisce la gestione delle chiavi per te, quindi non devi prendere decisioni ad-hoc su quali chiavi sono affidabili, ecc.
Riepilogo: se non sei un esperto di sicurezza e stai pensando al livello di AES, o SHA-1, o (ci mancherebbe) MD5, stai sbagliando . Utilizza una libreria scritta da esperti di sicurezza (come Bouncy Castle), che implementa protocolli progettati da esperti di sicurezza (come OpenPGP per la crittografia, o bcrypt o scrypt per l'hashing della password), invece di eseguire il rollover.
Non sono un esperto crittografico in alcun modo, ma so abbastanza per non provare a progettare i miei protocolli ad-hoc. Per essere chiari, l'intero post è materiale di Cryptography 101 . Quindi, se questo post non ha senso per te, allora non dovresti assolutamente avvicinarti alla crittografia.