Ho chiesto una domanda correlata in precedenza, ma questa volta voglio chiedere una versione più ampia:
Per semplificare le cose, diciamo che ho sviluppato un'applicazione che consente agli utenti di inviare messaggi in una chat room e tra loro (simile a IRC). La natura del messaggio non richiede troppa segretezza, nulla di sensibile viene mai condiviso.
Sviluppo un server open source e un client open source per l'applicazione. Gli utenti configureranno i propri server, fornirò semplicemente i programmi server e client.
Voglio che gli utenti abbiano account su ciascun server. Il client dovrebbe idealmente accedere con un nome utente e una password.
Posso presumere che il cliente non ruberà le informazioni dell'account perché l'utente l'ha preso da una fonte attendibile. Il problema è che il server non può essere considerato attendibile perché:
- Il proprietario di ciascun server può apportare modifiche al codice del proprio server.
- Possono vedere il contenuto di qualsiasi database.
Come posso autenticare gli utenti:
- senza consentire al proprietario del server di accedere alla password dell'utente
- senza consentire al proprietario del server di accedere a un precursore della password di un utente (qualsiasi cosa che non sia la password, ma può essere trasformata nella password dell'utente o utilizzata per accedere a un altro server).
- senza fare affidamento su una chiave precalcolata che deve rimanere nascosta sul client o sul server (il codice sorgente lo rivelerebbe).
- idealmente consentendo una password Modifica: Idealmente la password e il nome utente sarebbero tutto ciò che sarebbe necessario per accedere, quindi collegandosi con macchine diverse l'utente avrebbe solo bisogno della password e del nome utente.
Gli approcci che ho in mente:
-
Risposta alla sfida: inviare una sfida, cancellarla con una password e inviarla come risposta. Questo passa il requisito numero 1 e 3, ma fallisce il 2, in quanto richiede al server di avere anche accesso alla password con hash, che può essere trasformata nella password effettiva o utilizzata per accedere ad altri server (quest'ultimo è leggermente minore, dal momento che può essere affrontato se si verifica). La mia domanda altra va nei dettagli su come Ho implementato questa idea per i test.
2: Whitelist server: sembra un po 'come barare, ma soddisfa tutti i requisiti "rimuovendo" il problema più grande, il fatto che il server non può essere considerato attendibile. Se il client tenta di connettersi a un server non presente nella whitelist, verrà emesso un avvertimento con una parola strong (oppure l'accesso ai server non autorizzati potrebbe essere completamente bloccato). Questo ha il rovescio della medaglia nel complicare il processo di creazione di nuovi server da parte degli utenti e pone su di me maggiori responsabilità del semplice sviluppo dell'applicazione (dovrei gestire la whitelist). Inoltre, non garantisce necessariamente che il server possa essere considerato affidabile poiché anche se il proprietario non è malintenzionato, non è garantito che abbia una protezione adeguata sui propri sistemi.