Sicurezza degli schemi di autenticazione REST


Answers

REST significa lavorare con gli standard del web e lo standard per il trasferimento "sicuro" sul web è SSL. Qualsiasi altra cosa sarà un po 'funky e richiederà uno sforzo di implementazione extra per i client, che dovrà disporre di librerie di crittografia disponibili.

Una volta effettuato il commit su SSL, non c'è davvero niente di fantasia richiesto per l'autenticazione in linea di principio. È possibile utilizzare nuovamente gli standard Web e utilizzare l'autenticazione HTTP Basic (nome utente e token segreto inviati insieme a ciascuna richiesta) poiché è molto più semplice di un protocollo di firma elaborato e comunque efficace nel contesto di una connessione sicura. Devi solo essere sicuro che la password non vada mai oltre il testo normale; quindi, se la password viene mai ricevuta tramite una semplice connessione testuale, è possibile anche disabilitare la password e inviare la posta allo sviluppatore. È inoltre necessario assicurarsi che le credenziali non vengano registrate ovunque al momento del ricevimento, proprio come non si registrerebbe una normale password.

HTTP Digest è un approccio più sicuro in quanto impedisce il passaggio del token segreto; invece, è un hash che il server può verificare dall'altra parte. Anche se potrebbe essere eccessivo per le applicazioni meno sensibili se hai preso le precauzioni sopra menzionate. Dopo tutto, la password dell'utente viene già trasmessa in formato testo quando si effettua il login (a meno che non si stia eseguendo una bella crittografia JavaScript nel browser), e allo stesso modo i loro cookie su ogni richiesta.

Nota che con le API, è meglio che il client stia passando dei token - stringhe generate casualmente - invece della password con cui lo sviluppatore accede al sito web. Quindi lo sviluppatore dovrebbe essere in grado di accedere al tuo sito e generare nuovi token che possono essere utilizzati per la verifica dell'API.

Il motivo principale per utilizzare un token è che può essere sostituito se è compromesso, mentre se la password è compromessa, il proprietario può accedere all'account dello sviluppatore e fare tutto ciò che vuole con esso. Un ulteriore vantaggio dei token è che puoi rilasciare token multipli agli stessi sviluppatori. Forse perché hanno più app o perché vogliono token con diversi livelli di accesso.

(Aggiornato per coprire le implicazioni di rendere la connessione solo SSL.)

Question

Sfondo:

Sto progettando lo schema di autenticazione per un servizio web REST. Questo non ha "veramente" bisogno di essere sicuro (è più di un progetto personale) ma voglio renderlo il più sicuro possibile di un'esperienza di esercizio / apprendimento. Non voglio usare SSL dal momento che non voglio il fastidio e, soprattutto, la spesa per configurarlo.

Queste domande SO erano particolarmente utili per iniziare:

Sto pensando di utilizzare una versione semplificata dell'autenticazione di Amazon S3 (mi piace OAuth ma sembra troppo complicato per le mie esigenze). Sto aggiungendo un nonce generato casualmente, fornito dal server, alla richiesta, per impedire attacchi di riproduzione.

Per arrivare alla domanda:

Sia S3 che OAuth si basano sulla firma dell'URL della richiesta insieme ad alcune intestazioni selezionate. Nessuno di loro firma il corpo della richiesta per le richieste POST o PUT. Non è vulnerabile a un attacco man-in-the-middle, che mantiene l'url e le intestazioni e sostituisce il corpo della richiesta con tutti i dati richiesti dall'attaccante?

Sembra che posso evitare questo includendo un hash del corpo della richiesta nella stringa che viene firmata. È sicuro?




Ricorda che i tuoi suggerimenti rendono difficile per i client comunicare con il server. Devono capire la tua soluzione innovativa e crittografare i dati di conseguenza, questo modello non è così buono per le API pubbliche (a meno che tu non sia amazon \ yahoo \ google ..).

Ad ogni modo, se devi crittografare il contenuto del corpo ti suggerisco di verificare gli standard e le soluzioni esistenti come:

Crittografia XML (standard W3C)

Sicurezza XML




Se si richiede l'hash del corpo come uno dei parametri nell'URL e tale URL è firmato tramite una chiave privata, allora un attacco man-in-the-middle sarebbe solo in grado di sostituire il corpo con il contenuto che genererebbe il stesso hash. Facile da fare con i valori hash MD5 ora almeno e quando SHA-1 è rotto, beh, si ottiene l'immagine.

Per proteggere il corpo dalla manomissione, è necessario richiedere una firma del corpo, che un attacco man-in-the-middle potrebbe essere meno in grado di interrompere poiché non conoscono la chiave privata che genera la firma .




Links