PDA

View Full Version : [JaVa] un piccolo rompicapo!


pinkMoontwo
14-06-2007, 08:01
Salve a tutti!
Volevo esporvi il seguente problema.

Ho un'applicazione client e una server per l'autenticazione, devo fare in modo che la password non viaggi in chiaro, senza però utilizzare il package security di java.

Il procedimento in breve è il seguente :

Il server mi invia una stringa CASUALE di 8 caratteri .. str1;
Il client invia al server una stringa str3 (sempre di 8 caratteri) ottenuta come combinazione di str2 (altra stringa di 8 caratteri in possesso del client, sarebbe una password) e di str1.

Ricapitolando : il client riceve str1 (stringa casuale di 8 caratteri dal server) , la combina con str2 facendo uno xor carattere per carattere... ottengo str3:


StringBuffer temp = new StringBuffer();
for (int i= 0; i<8;i++){
temp.append( (char)(str1.charAt(i)^str2.charAt(i)) );
}

Poi converto in stringa perchè devo inviarlo su un Printer che nn accetta stringbuffer ma solo string

String str3 = new String (temp.toString());
os.println(str3);

Ho inviato str3 che è lo xor di str1 e str2 ok!


Ora dal lato server ricevo str3, devo risalire alla password (per verificarla) ossia a str2!
Ho pensato : semplice rifaccio lo xor!



StringBuffer temp = new StringBuffer();
for (int i= 0; i<8;i++){
temp.append( (char)(str3.charAt(i)^str1.charAt(i)) );
}


String str2 = new String (temp.toString());

Infatti ottengo la str2 originaria.

Il problema però è il seguente : molte volte non ottengo precisamente str2 ma una stringa troncata ...

es : stringa del client str2 = abcd
stringa ricavata dal server con lo xor str2 = a oppure abc oppure completa!

Ho pensato si tratti del casting che faccio in entrambi i casi, in quanto lo xor tra 2 caratteri dovrebbe restituire un intero (4byte) a fronte del casting char(2byte) che faccio. Non saprei, così funziona ma non sempre.
Avete qualche idea "più pulita" della mia? Ve ne sarei grato!

cionci
14-06-2007, 08:51
Il server mi invia una stringa CASUALE di 8 caratteri .. str1;
Il client invia al server una stringa str3 (sempre di 8 caratteri) ottenuta come combinazione di str2 (altra stringa di 8 caratteri in possesso del client, sarebbe una password) e di str1.

Ricapitolando : il client riceve str1 (stringa casuale di 8 caratteri dal server) , la combina con str2 facendo uno xor carattere per carattere... ottengo str3:
Ad occhio mi sembra che vada tutto bene, magari l'errore c'è nella parte che riguarda il passaggio dei dati sulla rete ?
Un protocollo di questo tipo non è sicuro...all'avversario basta fare l'xor fra str3 e str1...

Devi usare un hash di str2+str1...ma hai detto che non puoi usare la libreria java.security...
La cosa più semplice che mi viene in mente è un cifrario a passata multipla sfruttando la stringa casuale come chiave del cifrario...ma ovviamente non è un algoritmo sicuro, sicuramente più sicuro dello xor...

pinkMoontwo
15-06-2007, 19:15
Forse ho capito il problema!!!!! (ma non mi vengono soluzioni :muro: )

Probabilmente tutto parte da come sono memorizzati i caratteri in una stringa.
Vi è memorizzato il carattere o il codice del carattere?
Cioè se str1 = "ciao" ... in effetti vi è memorizzato "\u001 \u002....." ? (ho messo codici a caso ma spero mi sia spiegato cosa voglio intendere)
Perchè credo che se vi sono memorizzati effettivamente i caratteri "c","i" ecc nella stringbuffer finale ossia temp capiti ke la somma di 2 caratteri dia come risultato il carattere backspace....e il carattere venga perso! e quindi è normale che il server non ricostruisca del tutto la stringa.
Forse ho confuso tutto.... troppo tempo sullo stesso codice, ho perso quelle poche sicurezze che avevo :cry:

franksisca
16-06-2007, 11:23
se non ricordo male e ho capito cosa vuoi dire, i caratteri seguono la codifica della tabella ascii : http://it.wikipedia.org/wiki/Ascii

quindi l'esempio che dici tu col backspace potrebbe anche essere "vero".


comunque un metodo di codifica alternativa ci sarebbe:

converti in binario la password con il codice ascii(c'è proprio una funzione se non ricordo male) e poi in decimale, fai una operazione matematic "complessa" con il numero casuale(o anche la stringa, fai lo stesso procedimento)arrivato dal server e poi la invii al server.

stupido secondo voi???:confused: :confused: :confused: