Autenticazione API, token una volta VS token dinamici


13

Stiamo lavorando a un nuovo progetto, siamo due sviluppatori principali e ci siamo messi all'incrocio su come utilizzare un token per proteggere la comunicazione tra il server e il client.

Primo suggerimento: (Il token una volta Token statico AKA)

  1. il client richiede un token primario, inviando il nome utente e la password e current_time (questa variabile verrà salvata nel database del server e anche nel lato client) nell'API, il server interpreta l'input e esegue il rendering di un token con hash (ad esempio: 58f52c075aca5d3e07869598c4d66648) lo salva nel database e lo restituisce al client.

  2. Il client ora salva il token primario e crea un nuovo token con hash usando il token primario + la variabile current_time inviata nella richiesta di autenticazione (chiamiamo questo nuovo token, main_token) anche il server fa lo stesso e crea lo stesso token usando lo stesso algoritmo .

  3. Ogni volta che il client interroga l'API del server, invia il main_token al server, ora il server confronta il token generato in esso, con il main_token inviato dal client, se corrisponde, significa che l'utente è reale

Secondo suggerimento: (token dinamico)

  1. Il client genera due chiavi casuali ($ key1 = rand (10000.90000); $ key2 = rand (10000.90000);) Su ogni richiesta sull'API, il client crea un hash usando il tipo di query e le due chiavi con un algoritmo complesso e invia queste due chiavi + l'hash al server

  2. Il server, utilizzando lo stesso algoritmo utilizzato nel client, crea un hash e confronta con quello inviato dal client, se corrisponde, il server procede a gestire la query


Ora, la domanda è: qual è il modo più logico e sicuro da utilizzare per proteggere le richieste API?


2
In che modo il secondo è addirittura un mezzo di autenticazione? Ci deve essere qualcosa di proveniente dal server che usi client nella tecnica di autenticazione, altrimenti non c'è modo di sapere se il cliente appena costituito la chiave. Nella seconda tecnica, che cosa ha origine il server al termine del login che dà al client per garantire che il client sia lo stesso a cui lo ha dato?
Jimmy Hoffa,

1
Forse mi manca qualcosa ... ma perché non usare OAuth come meccanismo di autenticazione? È standard e ci saranno librerie che i tuoi clienti potranno usare in ogni lingua.
Icode4food

Risposte:


14

Mi piace molto il primo approccio in generale.

  • è semplice da capire e implementare
  • è sicuro (per quanto ne sappia)
  • è un approccio non insolito che ho visto usato in passato

Una cosa che non vedo menzionata sul primo che dovresti tenere a mente, il timestamp utilizzato per eseguire l'hash del token deve avere una scadenza TTL estremamente breve (come 1 secondo), quindi verifica che il messaggio non sia stato inviato con il stesso timestamp e token da un messaggio 12 ore prima; ovviamente calcolerebbe come legittimo ma non è in questo caso.

Se queste sono le uniche due opzioni che stai prendendo in considerazione, anche se mi piacerebbe solo assicurarti di aver preso in considerazione anche altri approcci, poiché ce ne sono molti. Più di quanto ho intenzione di elencare in effetti. Questi sono alcuni approcci di autenticazione comuni che vale la pena studiare solo per vedere se potrebbero adattarsi meglio al tuo scopo, e se nient'altro li capisce potrebbe darti alcune idee per aiutarti a stringere qualunque approccio segui.

Do atto, io sono non un esperto di sicurezza.


OAuth / Federated

In questo approccio hai un garante di terze parti in cui il codice utente richiede il token / cert / che cosa hai da loro e te lo passa, a questo punto tutto ciò che devi fare è chiedere alla terza parte se la chiave che ti è stata data è legittimo.

Pro:

  • Basato su standard
  • I problemi verranno rilevati da altri sui sistemi di altre persone, quindi scoprirai se si verifica insicurezza
  • Sarà necessario molto meno lavoro di autenticazione da parte tua

con:

  • Devi avere a che fare con un gestore di terze parti e la loro API, oppure creare e ospitare la tua "terza parte" per separare l'autent dal tuo servizio principale.
  • Per molti servizi eccessivo, ma concettualmente vale la pena considerare

Certificati asincroni

Qui avresti i tuoi clienti crittografare le loro comunicazioni con un certificato pubblico che hai condiviso con loro quando hanno creato un utente. Dalla tua parte decifreresti usando la chiave privata associata all'utente. Generalmente inizieresti la comunicazione con una risposta alla sfida per mostrare che possono crittografare / decrittografare come ti aspetti di identificarli come chi sostengono di essere. Sebbene siano possibili approcci "sincroni" che non utilizzano la risposta alla sfida, hanno un po 'meno sicurezza e alcuni problemi di sincronizzazione del tempo che possono renderli più complicati.

di Novell (sì, lo so, Novell ? Davvero?)

I token utilizzano una variabile come base per generare la password singola. Questa variabile è chiamata la sfida. I due metodi principali per determinare la variabile utilizzata per generare la password sono asincroni o sincroni.

Con il metodo asincrono o challenge-response, il software server invia al token una sfida esterna, una variabile generata casualmente, per la crittografia del dispositivo token. Il token utilizza questa variabile di verifica, l'algoritmo di crittografia e il segreto condiviso per generare la risposta, ovvero la password crittografata correttamente.

Con il metodo sincrono, la variabile challenge utilizzata per generare la password è determinata internamente dal token e dal server. Un contatore di tempo, contatore di eventi o combinazione di contatore di tempo ed eventi all'interno di ciascun dispositivo viene utilizzato come base per la variabile challenge. Poiché il token e il server determinano ciascuno separatamente e internamente la variabile challenge dai propri contatori, è molto importante che i loro contatori temporali e contatori eventi rimangano sincronizzati. Poiché è così facile per il server e il token uscire dalla sincronizzazione, la maggior parte delle implementazioni consente una certa deviazione tra i contatori. In genere, per calcolare la password viene utilizzato un intervallo o una finestra di questi valori del contatore. Tuttavia, se il token e il server non vengono sincronizzati oltre questa finestra,

Pro:

  • I certificati hanno radici CA che li rendono affidabili e difficili da forgiare
  • Ci sono servizi standard nei sistemi operativi per la gestione e la manutenzione facili di depositi di certificati
  • Approccio ben studiato, molte informazioni disponibili su di esso
  • La scadenza insieme a una varietà di altre cose sono strutture integrate di certificati standard, generalmente robuste

con:

  • I certificati possono essere difficili da lavorare a livello di codice
  • A seconda se si richiede una CA esterna, potrebbe non essere libero
  • Potrebbe essere necessario gestire manualmente gli archivi di certificati per garantire la configurazione dei trust root previsti

NTLM

Non ridere, se si tratta di un servizio solo più piccolo o interno e ti trovi in ​​un ambiente Windows, non c'è nulla di sbagliato nell'utilizzo dell'autenticazione NTLM standard per garantire l'accesso. Soprattutto se stai lavorando con IIS, questo è senza dubbio l'approccio più semplice. Facile da mantenere e configurare anche in un web.config.

Pro:

  • Estremamente facile da configurare, implementare e gestire

con:

  • Interoperabilità minima
  • Non sufficiente per l'autenticazione pubblica

nonces

Quando si lavora con nonces nel proprio approccio di autenticazione, si fornisce un metodo per ottenere un nonce sul servizio. Questo metodo restituisce una stringa arbitraria univoca o un pezzo di dati ("un nonce") su ogni richiesta. Ogni richiesta ad altri metodi ora richiede che un nonce sia recuperato e utilizzato nell'algoritmo crittografico per la richiesta. Il valore qui è che il server tiene traccia dei nonce utilizzati e non consente mai il riutilizzo di un nonce, questo impedisce completamente gli attacchi di riproduzione poiché una volta effettuata una richiesta con un nonce, una richiesta con quel nonce non potrà più essere fatta. Quando vengono richiesti nonces, questi vengono aggiunti a un elenco di nonces disponibili, poiché vengono utilizzati vengono spostati dall'elenco disponibile all'elenco utilizzato.

Pro:

  • I replay respingono abbastanza bene gli attacchi
  • Non del tutto difficile da implementare o comprendere

con:

  • Richiede che i client facciano due richieste per ciascuna richiesta (anche se può essere ridotta richiedendo nonces solo per determinate richieste)
  • Richiede la gestione di nonces, che dovrebbe essere transazionale
  • Influisce negativamente sulle prestazioni richiedendo le richieste extra per le nonces (la transazionalità aumenta ulteriormente il costo delle risorse per lavorare con le nonces)

Ho il sospetto che il TTL potrebbe aver bisogno di essere più lungo di un secondo, anche se più breve di un minuto (supponendo che HTTP / HTTPS sia il trasporto). Il TTL dipende dal ritardo del trasporto (ovvero, molto più lungo per la posta elettronica che per la connessione diretta).
Donal Fellows,

1
Hai dimenticato Kerberos . E metterei un avvertimento eccezionalmente forte contro il rotolamento del tuo pacchetto di autenticazione / token come suggerisce la domanda. RYO autenticazione è molto facile da sbagliare; un esempio sarebbe l'utilizzo di uno spazio chiave di seeding di soli 80.000 valori numerici a 5 cifre (dal secondo caso di OP). Devi anche stare attento a quali hash usi (dal primo caso). Molti sono ora banalmente interrotti dalle ricerche sui tavoli arcobaleno.

1
Grazie mille per la risposta, mi sono trasferito da quel progetto, ma terrò questa domanda tra le mie preferite. Mi dispiace di non aver accettato la tua risposta perché è molto approfondita. Ma che succede con Novell che è cattivo? :(
SAFAD,

@SAFAD niente di brutto su Novell, sono stato semplicemente gettato alla ricerca di risorse sui dettagli di sicurezza che ho trovato qualcosa di moderno da Novell, ho pensato che la compagnia si fosse estinta da secoli .. Concesso che erano in anticipo sul gioco ai loro tempi, ma era un molto tempo fa adesso. Apprezzo comunque l'accettazione, poiché Glen sopra menziona che potrebbe essere più approfondito, ma ho cercato di dare una panoramica semplicistica degli approcci normali. Kerberos è una svista piuttosto grande e una buona scelta ... forse lo aggiungerò ora ..
Jimmy Hoffa
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.