|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
[JAVA] RMI, come autenticare gli utenti?
Salve a tutti.
Avendo un'applicazione distribuita multiutente, come riconosco l'utente che sta effettuando la chiamata? Ad esempio, se un client chiama un metodo tipo changePassword(...), il server deve conoscere l'utente di cui cambiare la password. Io avevo pensato di avere un server per ogni utente autenticato, oppure di riconoscere l'host del client tramite RemoteServer.getClientHost(), ma se ci sono più utenti nello stesso host? Potrei forse intervenire sulle socket factory? Grazie
__________________
|Java Base| |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Mi rispondo da solo:
con RMI si possono esportare più server sulla stessa porta, quindi mi sa che creerò 1 server per ogni utente. Grazie lo stesso
__________________
|Java Base| |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
ehmm..
ma passare la stringa dell'username nel metodo changePassword? ![]() qualcosa del tipo: Codice:
superServerPippone.changePassword("MyUser", "NewPassword"); ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Sì, ma se l'utente tizio chiama:
superServerPippone.changePassword("caio","asdfg"); ![]()
__________________
|Java Base| |
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Quote:
Codice:
superServerPippone.changePassword(SHA("tizio","password attuale"),"pollo") Tecnicamente solo tizio sa calcolare la firma hash con sha di <user,passwordAttuale>. (è la prima tecnica di autenticazione che mi è venuta in mente, se mi ci impegno potrei trovarne di migliori)
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Quote:
![]() ![]() ![]() Scherzi a parte basta passarglielo nel metodo (che rimane sicuro perchè l'hash lo sa calcolare solo l'utente legittimo), tecnicamente sarebbe passibile di attacco di replay, ma visto che è un metodo di cambio password la vecchia password non sarà piu valida dopo l'invocazione
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Sì, ma mi interessa conoscere l'utente non solo per il cambio password,
ma ad esempio anche per transazioni finanziarie tipo diminuisci/aumenta credito, ecc. Praticamente un'autenticazione per ogni chiamata. Vedrò, intanto mi studio le socket factory ssl, alla prossima...
__________________
|Java Base| |
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Quote:
Codice:
public class Biglietto{ private String user; private TimeStamp timeToLive //TimeStamp sarà una classe che dice per quanto tempo il biglietto è valido private String server; private String fingerPrint; //costruttori etc. etc. } sever.doSomeWork(b,//altri parametri);[code], per l'autenticazione potresti utilizzare una banale sfida Client Codice:
String sfidaDalServer=server.primoPassoAutentica("sonoAlice"); Biglietto b=server.secondoPassoAutentica(calcolaHash(sfidaDalServer,miaPassword)); Attenzione che così il server autentica il client, ma il client non è sicuro di parlare col server, per quello ci vorrebbe una autentica a 2/3 direzioni. Il server avrà un insieme di biglietti validi e ad ogni richiesta del client controlla prima di tutto se il biglietto è valido (tramite confronto con la sua tabella), e poi l'utente che richiede servizio.
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB Ultima modifica di morskott : 24-01-2008 alle 20:25. |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
|
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
sendResponse(), che ritorna un riferimento al server (oggetto remoto) creato ad hoc per l'utente, che fa quindi le veci del biglietto... ogni chiamata remota è come se avesse come parametro (nascosto) il server a cui è diretta. Poi potrei anche usare le socket factory SSL con autenticazione del client, ho visto che le modifiche al codice sono minime, il grosso è la generazione delle keystore/truststore. Sto facendo delle prove, mi rifaccio vivo fra qualche giorno.
__________________
|Java Base| |
|
![]() |
![]() |
![]() |
#13 | |
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Quote:
U->S: sono Alice S->U: N (il server invia all'utente un nonce (stringa casuale sempre diversa)) U->S: N',H(N,N',S,K) S->U: H(N,N',K) doce con K ho indicato la password e con H(..) la funzione di hash, così sono mutuamente autenticati
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
N' e S cosa sono?
__________________
|Java Base| |
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
N' è un secondo nonce diverso da N e S la stringa che identifica il Server
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:51.