Cosa dovrebbero sapere i programmatori web riguardo alla crittografia? [chiuso]

27

I programmatori che costruiscono siti Web / applicazioni Web devono comprendere la crittografia? Non ho idea di come funzionano la maggior parte degli algoritmi crittografici, e davvero non capisco le differenze tra md5 / des / aes / etc. Qualcuno di voi ha trovato bisogno di una conoscenza approfondita della crittografia?

Non ne ho avuto bisogno, ma mi chiedo se forse mi manchi qualcosa. Ho usato hash sale + md5 per crittografare le password e dico ai web server di usare SSL. Oltre a questo, non posso dire di aver usato molto altro, né posso dire con certezza in che modo sono sicuri questi metodi. Li uso solo perché gli altri sostengono di essere al sicuro.

Hai mai trovato la necessità di utilizzare la crittografia nella programmazione web oltre a questi due semplici esempi?

    
posta davidhaskins 24.02.2011 - 14:59
fonte

7 risposte

41

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.

    
risposta data 24.02.2011 - 18:17
fonte
14

Non hai bisogno di sapere altro che le basi della crittografia (che cos'è un hash, che cos'è un sale, quanto è difficile decifrare questa crittografia o così e così via), ma devi sapere un bel po ' sulla sicurezza in generale.

Le principali aree di sicurezza che devi assolutamente conoscere come sviluppatore web:

  1. Iniezione SQL. Questo è probabilmente il foro più pericoloso che uno sviluppatore web può colpire su un sistema.
  2. Script e cookie tra siti.
  3. Spambot e captcha.
  4. Iniezione SQL. Non si può enfatizzare abbastanza quanto sia importante.
risposta data 24.02.2011 - 15:06
fonte
4

Ricordo di aver visto questo talk chiamato Ciò che ogni ingegnere deve sapere sulla sicurezza e dove si impara , l'oratore è Neil Daswani ed è un Google Tech Talk che ha dato, potrebbe essere un buon punto di partenza!

Tuttavia, non si applica solo ai programmatori Web, forse la domanda dovrebbe essere rinominata "Cosa dovrebbero sapere i programmatori in merito alla sicurezza?" in quanto non hanno bisogno di sapere più delle nozioni di base sulla crittografia (per quanto sia interessante)

    
risposta data 24.02.2011 - 15:04
fonte
2

Crypto è utile in molte situazioni. Un esempio che abbiamo utilizzato è la crittografia di un cookie di sessione creato e impostato da un host Win / IIS da utilizzare su un host LAMP.

Se si desidera implementare la crittografia (al contrario di hashing md5 / sha1), alcuni termini di base sono importanti, come la differenza tra la crittografia simmetrica e asimmetrica. Oltre a comprendere la differenza tra i due, dovresti sviluppare una comprensione di ciò che devi fare come sviluppatore web per archiviare e proteggere correttamente le chiavi di decrittografia. Ad esempio, se si sviluppa un'applicazione da distribuire su un host su cui non si dispone del controllo amministrativo completo, come un host condiviso, o la distribuzione su un server in cui tutti gli amministratori sono noti e affidabili.

    
risposta data 24.02.2011 - 15:23
fonte
2

Secondo me, dovresti sapere tutto sulla crittografia che qualcuno che attacca il tuo codice saprà. Dovresti comprendere hash, sale, la non casualità casuale, i principali algoritmi di crittografia (RSA, 3DES, AES, ecc.), SHA-1 / MD-5 / et al. Non devi memorizzarli, ma dovresti almeno sapere che l'efficacia di un algoritmo hash e come renderla più strong. Dovresti sapere quali collisioni e falsi positivi sono. Non dovresti essere in grado di recitare gli algoritmi di crittografia, ma dovresti avere familiarità con i loro benchmark, quali sono ideali per quali scenari. Dovresti essere in grado di descrivere e spiegare la crittografia simmetrica rispetto asimmetrica e quando usarla. Dovresti sapere cos'è PKI e come viene utilizzato. Dovresti sapere cos'è un'autorità di certificazione e come interagisce con i tuoi server.

Conoscere i dettagli di tutto non è importante quanto conoscerne lo sfondo. Quali sono i parametri di riferimento di alcune cose (quanto velocemente, quanto strong, debolezza, ecc.)

Queste raccomandazioni sono per informazioni di livello senior o di architetto. Se sei solo una scimmia del web a remare su un remo, non hai bisogno di sapere nulla di tutto ciò. Il tuo architetto dovrebbe conoscere questa roba. Se sei il responsabile del sito, lo progetta, lo implementa, ecc ... allora dovresti avere familiarità con tutti questi concetti e in grado di conversare in modo intelligente su di loro. Non devi essere in grado di insegnarlo, basta accettare e diffondere informazioni su di esso.

    
risposta data 24.02.2011 - 16:00
fonte
2

Dovresti usare bcrypt (Blowfish) per memorizzare le password piuttosto che MD5; è un algoritmo molto più lento , il che significa che è molto più difficile per un hacker indovinare e controllare. Inoltre, bcrypt accetta un fattore di lavoro come parametro, il che significa che può diventare ancora più lento man mano che i nuovi computer vengono introdotti, quindi ha un sistema integrato a prova di futuro.

Vedi Come archiviare in modo sicuro una password per ulteriori informazioni.

    
risposta data 24.02.2011 - 16:02
fonte
0

Come risposta piuttosto generica a questo tipo di domande, penso sempre che dovresti provare ad avere una comprensione di base di tutto ciò che è remotamente correlato a ciò che fai. Certo, hai bisogno di una conoscenza dettagliata specifica di ciò che stai effettivamente lavorando. È molto difficile prevedere come una certa area si evolverà, cosa sarà "di moda" o di cosa avrai bisogno in futuro, quindi avere una vasta area di cose che hai almeno "sentito parlare" manterrà molte porte aperte.

Per quanto riguarda la mia esperienza personale nella programmazione web ho trovato nozioni basilari di crittografia asimmetrica e roba utile per capire cosa sta succedendo sotto il cofano. Potrei essere sopravvissuto senza di essa, ma devo dire che mi piace la crittografia e la matematica, quindi perché no.

    
risposta data 24.02.2011 - 15:12
fonte

Leggi altre domande sui tag