Al lavoro sto provando a progettare un sistema di autenticazione utente privo di sessioni (inclusi token basati su sessioni come quelli utilizzati in OAuth2) a causa dei requisiti del software client. I servizi sono REST e stiamo cercando di progettare un sistema di autenticazione che possa utilizzare le intestazioni HTTP per comunicare i dati di autenticazione al server.
Ho già utilizzato l'autenticazione di firma delle richieste di Amazon EC2 [1] e l'ho trovato adatto ai nostri requisiti, tranne nel caso in cui avremmo a che fare con singoli utenti (che avranno una password) anziché script pianificati / automatici sistemi utilizzati per connettersi a EC2. Il sistema che ho creato funziona esattamente come EC2, con una differenza: invece del client dell'utente che memorizza una chiave API privata (la chiave di accesso AWS descritta nei documenti di EC2), memorizzerà una password (per esecuzione del software) che verrà quindi sottoposto a hash come è sul server e utilizzato per firmare la richiesta.
Per riepilogare come funzioneranno le richieste:
- L'utente inserisce la password nel software client
- Password software di hashing unidirezionale (whirlpool)
- Il software crea un digest (HMAC) della richiesta utilizzando la password con hash
- Il software effettua una chiamata al server Web, firmandola con il digest
- Ripeti il passaggio 4 fino all'uscita del software
Sul server:
- Il server riceve la richiesta, recupera la password con hash dalla tabella utente
- Il server crea il digest della richiesta con la password con hash e verifica che corrisponda a
- Se verificato, l'utente è autenticato e la richiesta viene eseguita
Prenderemo in considerazione anche le richieste restrittive per impedire attacchi ripetuti contro il server e preservare l'idempotenza del servizio e utilizzare HTTPS laddove possibile per fornire un ulteriore livello di sicurezza (questo potrebbe non essere sempre possibile tuttavia, a causa delle restrizioni del software).
Questo sistema è sicuro?
[1] link