Post  |  Commenti

Post Meta

26th
JUN

SSL assente? No problem… usa CHAP login system

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Posted by RedSend | Filed under Programming

No non temete, non volgio vendervi nulla, in questo post vi voglio introdurre ad un problema molto comune, ovvero quello di inviare atraverso le form html informazioni sensibili, come nome utente e password, su un canale insicuro non protetto. E’ fobia comune tra i più paranoici e anche quelli un pò meno, assicurarsi che ogni qual volta si inseriscono informazioni sensibili in un form html, controllare che la connessione avvenga tramite protocollo https e quindi utilizzando ssl per rendere il canale sicuro e criptato. A volte però capita che il server su cui si vanno ad inviare i dati non supporta il protocollo https, come ad esempio il server su cui risiede questo blog, quindi ogni qual volta inserisco nome utente e password per accedervi, le informazioni viaggiano in chiaro sotto gli occhi di tutti. Una possibile soluzione a questo inconveniente è l’utilizzo di un protocollo per l’autenticazione che garantisce la segretezza delle informazioni da inviare nonostante viaggino su un canale insicuro. Tra i vari protocolli che esistono, CHAP è uno di questi. Il suo funzionamento è molto semplice e per implementarlo è richiesta solo una funzione hash valida e la possibilità di concatenare delle stringhe :).

CHAP login system

Il livello di sicurezza di questo protocollo è pari a quello della funzione hash che si utilizza, giusto per essere chiari, una funzione hash è, scusate la ripetizione, una funzione univoca operante in un solo senso (ossia, che non può essere invertita), atta alla trasformazione di un testo di lunghezza arbitraria in una stringa di lunghezza fissa, relativamente limitata (info). L’idea che sta dietro al protocollo CHAP è questo:

  1. Il server al momento della richiesta del form per effettuare il login, generera un numero casuale che non si ripeterà in futuro e lo inserirà all’interno della sessione associata con il client che ha effettuato la richiesta e all’interno del form in un campo hidden
  2. Il client (il browser), riceverà il form con il numero generato dal server, farà inserire nome utente e password all’utente e al momento della sottomissione del form, provvederà a concatenarà le stringhe corrispondenti al nome utente, alla password e al numero inviato dal server le passerà alla funzione hash che restituirà una stringa di lunghezza fissa, la quale sarà l’unico dato insieme al nome utente ad essere inviato al server attraverso il canale di comunicazione non protetto.
  3. Il server per verificare se nome utente e password inviati dal client sono corretti, provvederà ad effettuare le stesse operazioni di prima, quindi concatenerà nome utente e password, recuperandole da un database o ovunque si voglia, aggiungerà anche il numero casuale generato recuperandolo dalla sessione associata al client e sulla stringa ottenuta vi calcolerà l’hash. Se il risultato ottenuto dalla funzione hash corrisponde alla stinga che ha ricevuto dal client, allora vuol dire che sono state usate le stesse informazione per calcolare l’hash e quindi che il nome utente e password erano corrette.

In questo modo l’unica informazione che viaggerà nel canale non protetto è la stringa corrispondente all’hash dei dati inseriti nel client, quindi essendo una funzione non invertibile, cioè che dall’hash di una stringa non è possibile ricavarne la stringa originale, anche se qualcuno è in ascolto sul canale non saprà cosa farsene dei dati catturati.

A questo indirizzo vi è una guida più dettagliata del protocollo e su una sua possibile implementazione utilizzando php e javascript.

Altri link: libreria MD5

Tags: > >

Reader's Comments

  1. RedSend » Blog Archive » SSL assente? No problem... usa CHAP Secure Login plugin |

    [...] tempo fà in questo post “SSL assente? No problem… usa CHAP login system” spiegai a grandi linee il funzionamento del protocollo CHAP per ottenere un login sicuro e non [...]

  2. Musikele |

    Ciao Red,
    ci sono alcune considerazioni sia tecniche sia principiantistiche che devo fare.
    In primo luogo, mi chiedevo come sia possibile fare una reale “autenticazione” mandando solo una stringa. Se il sito ha un solo utente, va bene; il server calcolerà l’hash e se combaciano va tutto ok.
    Ma se ci sono più utenti, come fai a sapere che quell’hash è specifico di un utente? Se l’hash, che per definizione non è invertibile, viene ricevuto dal server come “utente+password+numeretto” che ne sa il server a chi è associato? Più volte citi nell’articolo che l’unica informazione che viaggia sul canale è il numeretto criptato, e se ci colleghiamo io rapha e te a redsend.org … come va a finire? Il server si mette a calcolare tutti gli hash possibili per me rapha e te e poi controlla a chi è uguale? sembra una cavolata tremenda. Per questo ipotizzo che vengano inviate 2 informazioni: nome utente, e poi la stringa che contiene password e numeretto criptato, o giù di lì.
    Scusami se sembro banale ma ho avuto la pazienza di leggermi tutto e questo piccolo dettaglio non risulta evidente. Inoltre a SR ho preso 20 per miracolo quindi ammetto di non saperne molto. Delucidaci!

    Musikhell

  3. RedSend |

    si miky hai ragione, non basta inviare solo la stringa cifrata, ma serve anche il nome utente (ho corretto il post). Potrebbe essere comunque una soluzione non inviare neanche il nome utente sul canale, nel caso di pochi utenti, far calcolare al server tutti gli hash per ogni utente, verificare se uno coincide e di conseguenza dare l’autenticazione a quell’utente. Oltre a problemi di performance questa soluzione potrebbe portare anche altri problemi di sicurezza, che al momento non mi vengono in mente perchè ho ancora la faccia piena di sonno ma la cosa mi puzza.

Leave a Reply

Il contenuto di questo Blog è rilasciato sotto Licenza Creative Commons (Leggi)