I programmatori Web dovrebbero sapere che non dovrebbero mai provare a implementare la crittografia da soli.
In particolare, ciò significa che nessun esperto di sicurezza non dovrebbe toccare direttamente nessuna delle primitive crittografiche. Non dovrebbero pensare a livello di AES, SHA-1, ecc. Invece, dovrebbero usare funzioni di alto livello per crittografare e firmare i messaggi e per "hash" delle password.
Perché? Perché altrimenti, le persone vengono indotte in errore a pensare che:
- AES-256 è "ottima crittografia", nonostante il fatto che lo stiano utilizzando in modalità ECB o che utilizzino valori IV non casuali, ecc. (In alcune modalità, IV non casuali ma unici vanno bene. In altri, non così tanto.)
- Possono utilizzare la stessa chiave simmetrica per crittografare più messaggi (o peggio, archiviare 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 l'anello più debole, ripensaci .)
Solo per essere sulla stessa pagina, nessuno degli elementi sopra è a posto . Se non lo capisci, non dovresti toccare la criptovaluta con un palo da 10 piedi! (AES-256 è un'ottima crittografia, ma solo se la usi correttamente. "Non è la dimensione che conta, è ciò che fai con essa." :-))
Di che tipo di funzioni di alto livello sto parlando? Consiglio personalmente 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 hash. Ad esempio, con OpenPGP:
- Non utilizza RSA per crittografare i dati direttamente, ma genera invece una chiave di sessione casuale (simmetrica) per messaggio (questo è importante) e utilizza RSA per crittografare quella chiave di sessione.
- Utilizza una funzione di derivazione chiave per trasformare le passphrase in chiavi. (Nel linguaggio OpenPGP, si chiama S2K, ma penso che "funzione di derivazione chiave" sia il termine più standard.)
- Gestisce la scelta di una buona modalità, quindi non finirai mai con la BCE.
- 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 a livello di AES, SHA-1 o MD5 (cielo proibito), stai sbagliando . Usa 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'hash della password), invece di creare il tuo.
Non sono affatto un esperto di criptovalute, ma so abbastanza per non provare a progettare i miei protocolli ad hoc. Giusto per essere chiari, questo intero post è materiale di crittografia 101 . Quindi, se questo post non ha senso per te, non dovresti assolutamente avvicinarti alla crittografia.