Domanda

Sfondo:

Sto progettando lo schema di autenticazione per un servizio web REST. Questo non " veramente " Devo essere sicuro (è più un progetto personale) ma voglio renderlo il più sicuro possibile come un'esperienza di esercizio / apprendimento. Non voglio usare SSL poiché non voglio la seccatura e, soprattutto, le spese di configurazione.

Queste domande SO sono state particolarmente utili per iniziare:

Sto pensando di utilizzare una versione semplificata di L'autenticazione di Amazon S3 (mi piace OAuth ma sembra troppo complicato per le mie esigenze). Sto aggiungendo un

Altri suggerimenti

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

Una volta che ti impegni a SSL, non c'è davvero nulla di speciale richiesto per l'autenticazione in linea di principio. Puoi di nuovo andare con gli standard web e utilizzare l'autenticazione HTTP di base (nome utente e token segreto inviati insieme a ogni richiesta) in quanto è molto più semplice di un protocollo di firma elaborato e comunque efficace nel contesto di una connessione sicura. Devi solo assicurarti che la password non superi mai il testo normale; quindi se la password viene mai ricevuta tramite una connessione in testo normale, potresti persino disabilitare la password e spedire allo sviluppatore. Dovresti anche assicurarti che le credenziali non siano registrate da nessuna parte al momento della ricezione, così come non registreresti una password normale.

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. Sebbene possa essere eccessivo per le applicazioni meno sensibili se hai preso le precauzioni di cui sopra. Dopotutto, la password dell'utente viene già trasmessa in testo normale quando accede (a meno che tu non stia eseguendo una crittografia JavaScript sofisticata nel browser) e allo stesso modo i loro cookie su ogni richiesta.

Nota che con le API è meglio che il client passi 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 usare un token è che può essere sostituito se è compromesso, mentre se la password è compromessa, il proprietario potrebbe accedere all'account dello sviluppatore e fare tutto ciò che vuole con esso. Un ulteriore vantaggio dei token è che è possibile emettere più token agli stessi sviluppatori. Forse perché hanno più app o perché vogliono token con diversi livelli di accesso.

(aggiornato per comprendere le implicazioni del rendere solo la connessione SSL.)

Oppure potresti utilizzare la soluzione nota a questo problema e utilizzare SSL. I certificati autofirmati sono gratuiti ed è un progetto personale giusto?

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

Per proteggere il corpo da manomissioni, è necessario richiedere una firma del corpo, che un attacco man-in-the-middle avrebbe meno probabilità di riuscire a rompere poiché non conoscono la chiave privata che genera la firma.

In effetti, l'autentica S3 originale consente di firmare il contenuto, sebbene con una firma MD5 debole. Puoi semplicemente applicare la loro pratica opzionale di includere un'intestazione Content-MD5 nell'HMAC (stringa da firmare).

http://s3.amazonaws.com/doc/s3- developer-guida / RESTAuthentication.html

Il loro nuovo schema di autenticazione v4 è più sicuro.

http: //docs.aws.amazon. com / generali / ultima / gr / firma-versione-4.html

Ricorda che i tuoi suggerimenti rendono difficile per i client comunicare con il server. Devono comprendere 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 ..).

In ogni caso, se devi crittografare il contenuto del corpo, ti suggerirei di verificare gli standard e le soluzioni esistenti come:

Crittografia XML (standard W3C)

Sicurezza XML

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top