Cosa dovrebbero sapere i programmatori web sulla crittografia? [chiuso]


27

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

Non ne ho avuto bisogno, ma mi chiedo se forse mi manca qualcosa. Ho usato hash salt + md5 per crittografare le password e dico ai server web di usare SSL. Oltre a ciò, non posso dire di aver usato molto altro, né posso dire con certezza quanto siano sicuri questi metodi. Li uso solo perché altre persone affermano di essere al sicuro.

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


4
Dovrebbero sapere abbastanza per sapere che non dovrebbero farlo.
SLaks,

@SLaks: +1 100% d'accordo. Ho scritto una risposta a questo thread per espandere il motivo per cui questo è.
Chris Jester-Young,

Risposte:


41

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.


4
eccezionale. mi è piaciuto molto il post sul blog collegato a "ripensaci". chargen.matasano.com/chargen/2007/9/7/…
davidhaskins

+1, ma usando la stessa chiave simmetrica più volte va bene. Ecco a cosa serve l'IV (altrimenti non ne avresti bisogno).
orip,

1
Inoltre, Colin Percival della fama di Scrypt (e altri) ha un grande articolo chiamato "Risposte crittografiche giuste" che espone le decisioni crittografiche pane e burro che devi prendere. SSL è molto problematico (la revoca delle chiavi è molto difficile da implementare). Maggiori informazioni qui: daemonology.net/blog/…
orip

@orip Accetto, anche se direi che usare la stessa chiave con un IV diverso è di solito più utile nel caso in cui il tuo messaggio sia più lungo della dimensione del blocco della cifra simmetrica prescelta, piuttosto che per messaggi distinti, dove non avresti contesto per tenere traccia degli IV utilizzati per i messaggi precedenti. Inoltre, concorda con l'articolo di Colin Percival.
Chris Jester-Young,

1
@ Piacere ho cambiato il link a qualcosa di più rilevante.
Chris Jester-Young,

14

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

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

  1. SQL Injection. Questo è probabilmente il singolo buco più pericoloso che uno sviluppatore web può eseguire su un sistema.
  2. Scripting e cookie tra siti.
  3. Spambots e captchas.
  4. SQL Injection. Non si può sottolineare abbastanza quanto sia importante.

Non capire nulla di ciò che stai facendo è molto pericoloso. Non sapere quale differenza tra un hash digest digest e un hash crittografico può rovinarti. Non sapere come salare può rovinarti.
Incognito,

@ user1525 Questo è ciò che intendevo come le basi della crittografia. Non hai assolutamente bisogno di sapere come funziona effettivamente nessuno degli algoritmi di encryuption.
biziclop,

Apprezzo la risposta e sono d'accordo sull'iniezione di SQL e altri attacchi, ma stavo davvero chiedendo informazioni sulla crittografia.
davidhaskins,

2
@davidhaskins Sì, ho solo pensato che valesse la pena sottolineare, perché ogni livello si basa su quello precedente. Sapere come funziona AES non vale nulla se non si riesce a proteggere l'applicazione a un livello più elementare. Nella mia esperienza, questa è una trappola nella quale molti sviluppatori cadono (l'ho fatto più volte), per concentrarsi sulla crittografia e perdere di vista il suo ruolo nella lunga catena della sicurezza.
biziclop,

4

Ricordo di aver visto questo discorso chiamato Ciò che ogni ingegnere deve sapere sulla sicurezza e su dove impararlo, l'oratore è Neil Daswani ed è un discorso tecnico di Google che ha tenuto, potrebbe essere un buon punto di partenza!

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


2

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

Se devi implementare la crittografia (al contrario dell'hash md5 / sha1), alcuni termini di base sono importanti, come la differenza tra crittografia simmetrica e asimmetrica. Oltre a comprendere la differenza tra i due, è necessario sviluppare una comprensione di ciò che è necessario fare come sviluppatore Web per archiviare e proteggere correttamente le chiavi di decrittazione. Ad esempio, se si sviluppa un'applicazione da distribuire su un host su cui non si ha il pieno controllo amministrativo, come un host condiviso, rispetto alla distribuzione su un server in cui tutti gli amministratori sono noti e affidabili.


2

Secondo me, dovresti sapere tutto sulla crittografia che qualcuno che attacca il tuo codice saprà. Dovresti comprendere hash, salt, la non casualità di random, 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 di hash e come renderlo più forte. Dovresti sapere quali sono le collisioni e i falsi positivi. 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 vs asimmetrica e quando usarla. Dovresti sapere cos'è la PKI e come viene utilizzata. Dovresti sapere cos'è un'autorità di certificazione e come interagisce con i tuoi server.

Conoscere i dettagli di ogni cosa non è importante quanto conoscerne il background. Quali sono i parametri di riferimento di determinate cose (quanto velocemente, quanto forte, debolezza, ecc.).

Queste raccomandazioni sono per informazioni di livello senior o architetto. Se sei solo una scimmia web che rema un remo, non devi sapere nulla di tutto questo. Il tuo architetto dovrebbe sapere queste cose. Se sei responsabile del sito, progettandolo, implementandolo, ecc ... allora dovresti avere familiarità con tutti questi concetti e essere in grado di conversare in modo intelligente su di essi. Non devi essere in grado di insegnarlo, basta accettare e diffondere informazioni al riguardo.


2

È necessario utilizzare bcrypt (Blowfish) per memorizzare le password anziché MD5; è un algoritmo molto più lento , il che significa che è molto più difficile per un hacker indovinare e controllare. Inoltre, bcrypt prende un fattore di lavoro come parametro, il che significa che può diventare ancora più lento man mano che vengono introdotti i computer più recenti, quindi è integrato per il futuro.

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


0

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

Per quanto riguarda la mia esperienza personale nella programmazione web, ho trovato le nozioni di base sulla crittografia asimmetrica e quella roba utile per capire cosa sta succedendo sotto il cofano. Avrei potuto sopravvivere senza di essa, ma devo dire che mi piacciono la crittografia e la matematica, quindi perché no.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.