View Full Version : crittografia e timer in java
loveforSCSI
09-09-2002, 08:54
1) se ho un loop del tipo
while (true)
{
prima parte : fa qualcosa
seconda parte : fa altro
}
cioà suddiviso logicamente in due sottoparti, come posso fare a impostare un timer che le attivi nell'ordine giusto e ciclicamente?
che classi devo importare e che metodi devo usare?
2) ho due programmi che si scambiano messaggi ( stringhe)
devo fare in modo che la trasmissione sia crittata...l'algoritmo non ha molta importanza....ne basta uno semplice...
anche qui come devo fare? che classi importare? che metodi usare?
ciao!!
loveforSCSI
09-09-2002, 09:35
vi prego una rispostina :(...in particolare sulla crittografia..sono nel panico!!
Originariamente inviato da loveforSCSI
[B]vi prego una rispostina :(...in particolare sulla crittografia..sono nel panico!!
sulla crittografia ti ho gia' risposto, puoi fare in modo che la comunicazione sui tuoi socket sia crittata con ssl. se usi un jdk inferiore all'1.4 scaricati le estensioni JSSE, se usi l'1.4 sono gia' comprese.
se hai problemi nell uso delle librerie posta pure, non le ho mai usate ma non dovrebbero essere complicate ;)
loveforSCSI
09-09-2002, 10:24
ciao..spero che le vacanze siano andate bene....
dunque io ho scaricato java criptography extensions..
sono in laboratorio e uso eclipse....la jce contiene jar e non class quindi ho problemi di importazione....
che sto cercando di risolvere..
piuttosto..per il discorso del timer...sai dirmi qualcosa?
ho cercato su due libri di java ma non ho trovato niente...
cerca con google java.util.Timer
io non lo ricordo molto bene, cmq mi sembra che serva per eseguire determinati task ad un certo tempo o a intervalli di tempo.
loveforSCSI
09-09-2002, 13:16
alora, ho scaricato il java criptography extensions...e dovrebbe esserci un package chiamato javax.crypto ma NON esiste !!!!!!!!!
mi pare di aver capito che lì ci sono le 2 cose in croce che mi servono.....basterebbero un metodo che critta e uno che decritta con una lgoritmo semplice semplice....magari con una sola chiave pure fissa!!
ma non riesco a importare sto javax.crypto !! quindi non posso nemmeno fare esperimenti!
infatti non hai bisogno di jce ma di jsse! :o
http://java.sun.com/products/jsse/index-103.html
il package e' javax.net.ssl
ciao
P.S. per il timer non ho capito di che hai bisogno :o :)
loveforSCSI
09-09-2002, 14:52
ciao king...meno male che ci sei tu....:)...
dunque per il timer...una cosa apparentemente semplice...
si tratterebbe di avere un metodino che aspetta per x millisecondi che qualcuno scriva qualcosa con la tastiera, dopodichè attiva una routine che prende in input i messaggi che gli altri client hanno scritto e poi ritorna nuovamente a controllare se qualcuno ha scritto qualcosa con la tastiera...e così via...
ciao!!!
loveforSCSI
09-09-2002, 15:09
ti posto le nuove versioni del client e del server...
mi rimangono due cose da fare: criptare le comunicazioni e gestire meglio il printtoeveryone (ora non c'è più...ho usato un altro sistema)...x quest'ultima cosa ho bisogno del timer...
comunque x criptare avrei bisogno di fare in modo che ogni volta che accedo agli oggetti in e out lo faccio in maniera criptata ) x esempio ssl)
ciao!!
import corejava.*;
import java.io.*;
import java.net.*;
import java.util.*;
class Servizio extends Thread
{
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Servizio(Socket s) throws IOException
{
socket = s;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// flush automatico:
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
start();
}
public void run()
{
try
{
String id = in.readLine();
System.out.println("avviata autenticazione per "+id+".....");
boolean okid = false ;
int puntatore=0;
for ( int x=0 ; x < Server.clients.size() ; x++)
{
String nome = (String)Server.clients.get(x);
if ( nome.equals(id) )
{
puntatore = x;
okid = true;//in Java il confronto di stringhe fatto con == è sbagliato!!!!!
}
}
boolean okpass = false;
String reqpass = "inserire la password:";
out.println(reqpass);
String pass = in.readLine();
String accettato = "autenticato.";
String rifiutato = "non autenticato";
String psw = (String)Server.password.get(puntatore);
if(psw.equals(pass))
{
okpass = true;
}
boolean OK = okid & okpass;
if (OK == true)
{
System.out.println(id + " si e' autenticato.");
//adesso visualizziamo la variabile puntatore
System.out.println("l'indice del client che si è autenticato è :"+puntatore);
//adesso inseriamo nel vettore " autenticati" l'identificativo dell'
//utente che si è appena autenticato
Server.Inserimento(id,puntatore);
//vediamo il vettore autenticati
System.out.println("il vettore autenticati adesso è:");
Server.MostraAutenticati();
out.println (accettato);
while (true)
{
String messaggio = in.readLine();
Server.messaggi.set(puntatore,messaggio); //memorizziamo il messaggio nella posizione giusta
if (messaggio.equals("fine")) break; //esce dal loop
System.out.println(id+":" + messaggio);
for(int counter = 0; counter< Server.messaggi.size(); counter++)
{
String name = (String)Server.autenticati.get(counter);
String mex = (String)Server.messaggi.get(counter);
if ((name != "null") & (mex !="null"))
{
String conferma = name+":"+mex;
out.println(conferma);
}
}
String eot = "eot";
out.println(eot);
}
System.out.println(id+" ci ha lasciato...");
Server.Rimozione(id,puntatore);
System.out.println("il vettore autenticati adesso è:");
Server.MostraAutenticati();
}
else
{
out.println(rifiutato);
System.out.println("autenticazione fallita per " + id + ".");
socket.close();
}
}
catch (IOException e){}
finally
{
try
{
socket.close();
}
catch(IOException e) {}
}
}
}
public class Server
{
static final int porta = 8080;
public static Vector file = new Vector();//recuperiamo dal file ogni riga e la inseriamo in questo vettore
public static Vector clients = new Vector(); //questo vettore ospita i nomi utente dei clients
public static Vector password = new Vector(); //questo vettore ospita le password di ciascun utente
public static Vector autenticati = new Vector();// in questo vettore vengono inseriti ii nomi dei client che via via si autenticano
public static Vector messaggi = new Vector(); //in questo vettore vengono memorizzati i
//messaggi che i clients, via via che si autenticano, scrivono..tali messaggi vengono
//re-diretti verso tutti gli altri clients...per semplicità le dimensioni del vettore
// messaggi sono le stesse del vettore clients
public static void main(String[] args) throws IOException
{
ServerSocket s = new ServerSocket(porta);
String local = System.getProperty("user.dir");
System.out.println ( "la directory locale è:" + local);
int maxclients = Console.readInt("quanti client possono collegarsi contemporaneamente al server ?");
BufferedReader in = new BufferedReader(new FileReader("password.txt"));//il file di password contiene alternati su righe successive nomi utente e password
String riga;
int i = 0;
try
{
do
{
if ((riga = in.readLine()) != null)
{
String k= new String(riga);
file.add(i,k);
//System.out.println ( " ho letto la riga :" + (i+1) + "del file");
//System.out.println ( " la stringa letta è:" + riga);
i++;
}
}
while (riga != null);
in.close();
// for ( int z=0 ; z<vett.size() ; z++)
// {
// String stringa = (String)vett.get(z);
// System.out.println("la riga"+(z+1) +" letta e'"+stringa);
// }
}
catch(IOException e)
{
System.out.println("non posso leggere dal file");
}
System.out. println("il file e':");
for (int m=0 ; m<file.size() ; m++)
{String g = (String)file.get(m);
System.out.println(g);
}
System.out.println(" adesso inizializzo il vettore dei nomi utente e delle password");
int punt1=0;
int punt2=0;
for (int p=0 ; p<file.size() ; p=p+2)
{
String temp1 = (String)file.get(p);
clients.add(punt1,temp1);
punt1 = punt1 +1;
}//ho inizializzato il vettore client
for (int q=1 ; q<file.size() ; q=q+2)
{
String temp2 = (String)file.get(q);
password.add(punt2,temp2);
punt2 = punt2+1;
}//ho inzializzato anche il vettore delle password
//ora abbiamo due vettori che contengono nomi utente e password
//...essendo disponibile il vettore clients, possiamo impostare la dimensione
// del vettore messaggi e del vettore autenticati
//..in questo modo agiremo su di esso tramite il metodo set
messaggi.setSize(clients.size()); // :)
autenticati.setSize(clients.size()); // :)
//a questo punto inizializziamo il vettore messaggi con la
//stringa vuota
String empty = "null";
for ( int b = 0 ; b < messaggi.size() ; b++)
{
messaggi.setElementAt(empty,b);
}
//e inzializziamo con la stessa stringa vuota anche il vettore autenticati
for ( int w = 0 ; w < autenticati.size() ; w++)
{
autenticati.setElementAt(empty,w);
}
System.out.println ("i nomi utente sono:");
for ( int z=0 ; z<clients.size(); z++)
{
String a = (String)clients.get(z);
System.out.println(a);
}
System.out.println ("le password sono ( nell'ordine):");
for ( int j=0 ; j<password.size(); j++)
{
String b = (String)password.get(j);
System.out.println(b);
}
System.out.println("Server avviato in attesa della connessione dei clients....");
try {
while(true)
{
Socket socket = s.accept();
try
{
new Servizio(socket);
}
catch(IOException e)
{
socket.close();
}
}
}
finally
{
s.close();
}
}
public static void Inserimento (String nome, int punt)
{
autenticati.set(punt,nome);
}
public static void Rimozione ( String nome, int punt)
{
autenticati.set(punt,"null");
}
public static void MostraAutenticati()
{
for (int contatore = 0 ; contatore < autenticati.size() ; contatore++)
{
String c = (String)autenticati.get(contatore);
if ( c != "null") System.out.println(c);
}
}
}
Originariamente inviato da loveforSCSI
[B]ciao king...meno male che ci sei tu....:)...
dunque per il timer...una cosa apparentemente semplice...
si tratterebbe di avere un metodino che aspetta per x millisecondi che qualcuno scriva qualcosa con la tastiera, dopodichè attiva una routine che prende in input i messaggi che gli altri client hanno scritto e poi ritorna nuovamente a controllare se qualcuno ha scritto qualcosa con la tastiera...e così via...
ciao!!!
sono in ufficio e non posso leggere tutto il codice che hai postato ;)
io farei due thread diversi, uno che gestisce l'input e uno che si occupa di mandare tutti i messaggi ai client. Facendo come dici tu se uno scrive mentre e' attiva la spedizione dei messaggi il programma non "sentirebbe" la pressione dei tasti.
per i socket con ssl scaricati il package che ti ho detto, infilato in classpath e fai qualche prova che non sembra complicato :o
cos'e' sta roba?
import corejava.*; :confused:
loveforSCSI
09-09-2002, 15:27
corejava è un package che contiene una classe Console per fare input da tastiera..ho iniziato con quella e me la sono tenuta
mi spiegheresti in due parole come funziona ssl?....
credo che sia così:
mi invento una chiave tipo
string chiave = " abcdefgddhdhhd"
se voglio crittare una stringa ci sarà il metodo
String stingaCrittata=crittaSSL(stringa in chiaro,chiave)
per decrittare
String stringaInChiaro = decritta(stringaCrittata,chiave)
è così???
nella apidoc di jsse parlano di cose parecchio più incasinate...
sto dando un'occhiata al package (mai usato).
per creare un Socket:
SocketFactory sf = SSLSocketFactory.getDefault();
Socket s = sf.createSocket("Server", 443);
//443 e' la porta standard ssl
per creare un ServerSocket:
ServerSocketFactory ssf = SSLServerSocketFactory.getDefault();
ServerSocket ss = ssf.createServerSocket(443);
fatti questi cambiamenti il tuo codice dovrebbe rimanere invariato :)
loveforSCSI
09-09-2002, 16:36
grazie....adesso provo...sto usando un ide un po' rompicoglioni (eclipse).....
però la chiave non bisogna specificarla?
ciao!!:) :) :)
Originariamente inviato da loveforSCSI
[B]grazie....adesso provo...sto usando un ide un po' rompicoglioni (eclipse).....
però la chiave non bisogna specificarla?
ciao!!:) :) :)
non conosco eclipse, e' open source?
la chiave non occorre specificarla, pero' penso occorra un certificato, ma devo leggere un attimino la documentazione :o :o
cmq prova cosi', se non funziona fatti sentire ;)
loveforSCSI
09-09-2002, 16:51
si è opensource....è sul server del mio laboratorio...
se vuoi scaricarlo da lì posso lavorarci..
un certificato?
ma cosa è un certificato?
loveforSCSI
09-09-2002, 18:16
bo, io sarò pure rincoglionito ( anzi lo sono sicuramente) però nel jsse che ho scaricato dal link che mi hai dato non ci sono package ma 3 file jar (???)...ora io li ho messi nel class path ma se provo un'importazione di javax.net.ssl mi dice che non esiste il package...
forse le classi sono dentro ai jar...e magari i jar vanno trattati in maniera particolare (è così?)...
guarda per il timer non fa niente....così come è ora un client vede cosa hanno scritto gli altri client solo se lui scrive un messaggio ( oppure preme invio e basta)...lo so che non è proprio come in una chat..ma io mi sono rotto il xxxxx con sto lavoro e se lo beccano così com'è...non posso starci per altro tempo sopra....
quindi gli faccio sta benedetta crittografia e basta!
ciao
non conosco eclipse ma nella maggior parte dei tool di sviluppo se metti i jar in classpath le classi contenute vengono viste senza problemi dall'ambiente. In ogni modo non scompattare i jar, cerca nel tuo tool l'opzione per aggiungere nuovi package.
loveforSCSI
10-09-2002, 10:45
ci sono riuscito alla fine a importare questi jar maledetti!
hai ragione sul certificato...fatte le modifiche se avvio il server mi dà questo errore:
No available certificate corresponds to the SSL cipher suites which are enabled.
ma il certificato è un file oppure è una costante che devo crearmi io?
spulcio la apidoc...se sai già la risposta postala plaese :)
ciao e grazie
ho dato un occhiata, esiste un tool (keytool) per la generazione "fai da te" di chiavi per l'ssl.
e' spiegato piu'ttosto bene qui:
http://java.sun.com/products/jsse/doc/guide/API_users_guide.html#InstallationAndCustomization
Ciao
loveforSCSI
10-09-2002, 16:22
ho quasi risolto il problema del timer ( già che ci sono..:))
lma ho bisogno di sapere come fare input da tastiera non bloccante ( corejava...............) infatti ora i client possono ricevere i messaggi degli altri solo se viene premuto un tasto...appunto perchè l'input che fa corejava è bloccante...
in alternativa la lettura dei messaggi la potrebbe fare un altro thread...il problema è che non riesco ad agire sullo stream di input da un altro thread perchè non posso dichiararlo public
:( :(
mi sembra molto piu' semplice la seconda che hai detto, quela di crersi thread diversi che gestiscono input e output. ;)
se non sono indiscreto tutto 'sto macello a che ti serve???
loveforSCSI
10-09-2002, 17:22
si è anche più elegante da un altro thread ...avevo pensato di fare in modo che fosse quel thread periodicamente a mostrare i messaggi degli altri client....non riesco ad accedere allo stream di input del client.. eclipse mi dice che non è possibile dichiarere pubblico un socket.....:(
ciao!!!
loveforSCSI
10-09-2002, 17:27
comunque tutto sto lavoro fa parte dell'esame di calcolatori elettronici II.....e vale 1 punto su 30 ( perchè sono stronzi)...inzialmente dovevo fare un lavoretto semplice....poi però me l'hannno cambiato (grrrr)....
ma è quasi finito ormai e ho imparato (penso) la base della base delle basi per imparare java....
quindi non è tempo perso...
ho scaricato keytool ma in lab non ho diritti di installazione e non ho nemeno un disco x portarmelo a casa.....
non c'ho + voglia....ti prego continua a darmi una mano a accedere allo stream di input da un altro thread :) e a sistemare la crittografia così finisco, consegno il lavoro, metto il tuo nome nei ringraziamenti ( sei l'unico che ringrazierò, penso) così me ne vado da sto laboratorio che la gente che c'è qui mi sta sul cazzo....
Originariamente inviato da loveforSCSI
[B]non c'ho + voglia....ti prego continua a darmi una mano a accedere allo stream di input da un altro thread :) e a sistemare la crittografia così finisco, consegno il lavoro, metto il tuo nome nei ringraziamenti ( sei l'unico che ringrazierò, penso) così me ne vado da sto laboratorio che la gente che c'è qui mi sta sul cazzo....
mandami una mail con l'ultima versione dei sorgenti e i problemi che ti impediscono di cinire, cerco di trovare il tempo per darti una mano anche se sono parecchio incasinato.
-> alessio.xxxxxx@genie.it
Ciao
loveforSCSI
11-09-2002, 08:49
grazie...lo faccio subito....
..
loveforSCSI
11-09-2002, 09:22
fatto..scusa ma l'allegato è nella seconda mail...mi si è inchiodato il form del portale di libero...
poi dimmi quanto ti devo!
ciao!!!
(Alessandro)
loveforSCSI
11-09-2002, 09:41
ecco..la modifica che farei a client:
il thread timer task, passati 3 secondi, si legge quello che arriva da in e lo fa vedere ( eot segnala che sono finiti i messaggi da leggere) mentre il thread Client apsetta che l'utente scriva un messaggio.
ciao!!
class RemindTask extends TimerTask
{
public void run()
{
// System.out.println("il tempo è scaduto, controllo i messaggi degli altri client ");
// in
while( true )
{
if (conferma.equals("eot")) break;//eot segnala al Client che ha ricevuto tutti i messaggi disponibili
else
{
conferma = in.readLine();//aggiunta
System.out.println(conferma);//aggiunta
}
indice = 1; // indice = 1 fa iniziare il controllo messaggi in arrivo
timer.cancel();
Originariamente inviato da loveforSCSI
[B]fatto..scusa ma l'allegato è nella seconda mail...mi si è inchiodato il form del portale di libero...
poi dimmi quanto ti devo!
ciao!!!
(Alessandro)
non mi e' arrivato nulla, purtroppo da un po' di tempo in qua la posta di infinito e' diventata una mer*a :mad:
se puoi rimanda tutto a alessio.x@tiscalinet.it
Ciao
loveforSCSI
11-09-2002, 11:08
fatto.
ciao!!!!!
(Alessandro)
loveforSCSI
11-09-2002, 13:12
è arrivato?
Originariamente inviato da loveforSCSI
[B]è arrivato?
si' stasera li guardo con calma ;)
Ciao
loveforSCSI
13-09-2002, 07:08
mah! ho provato in tutti i modi che conoscevo ma non riesco proprio a agire su in dal thread Reminder.....
non riesco proprio a capire....
Ciao, purtroppo non ho fatto in tempo a dare un'occhiata al codice, lo faccio nel weekend. :o
loveforSCSI
13-09-2002, 10:04
thanks!
io mi sono quasi arreso...evidentemente c'e' qualcosa che non ho ancora studiato...:)
loveforSCSI
15-09-2002, 20:55
ciao hai fatto qualcosa? teoricamente martedì dovrei consegnare tutto! :( :(
ciao!!!
sono riuscito (stanotte :( ) a far funzionare l'ssl:
devi creare un keystore e un trustsstore. fai le modifiche al codice che avevi provato settimana scorsa (quelle con l'SSLSocket ) e vai nella directory dove hai le classi e digita:
(fai le modifiche del caso per alias, nome file e password)
keytool -genkey -alias alessio -keyalg RSA -validity 7 -keystore alekeystore
keytool -export -alias alessio -keystore keystore -rfc -file alessio.cer
keytool -import -alias alessiocert -file alessio.cer -keystore aletruststore
a questo punto per lanciare il server e il client digita:
java -Djavax.net.ssl.keyStore=alekeystore -Djavax.net.ssl.keyStorePassword=password Server
java -Djavax.net.ssl.trustStore=aletruststore -Djavax.net.ssl.trustStorePassword=password Client
prova, a me funziona :)
loveforSCSI
16-09-2002, 10:30
ok domani provo...oggi devo studiare perchè domani ho l'esame di automazione industriale! e non ho studiato un cazz...
saresti così buono da mandarmi i sorgenti modificati?
ma alias e password possono essere parole di qualunque lunghezza?
ciao e grazie 1k!!!
Originariamente inviato da loveforSCSI
[B]ok domani provo...oggi devo studiare perchè domani ho l'esame di automazione industriale! e non ho studiato un cazz...
saresti così buono da mandarmi i sorgenti modificati?
ma alias e password possono essere parole di qualunque lunghezza?
ciao e grazie 1k!!!
i sorgenti li ho a casa, cmq ho fatto solo la modifica sulla creazione dei Socket e del ServerSocket :o
non so quale sia il lmite di lunghezza, ma non dovrebbe essere troppo corto ;)
loveforSCSI
16-09-2002, 17:58
se ti ricordi mandameli che con Eclipse non si sa mai!
loveforSCSI
17-09-2002, 16:37
29 di automazione industriale!!!:) :D
i sorgenti non mi sono ancora arrivati!
puoi spedirli qui: xaan@libero.it
ciao!!
loveforSCSI
17-09-2002, 17:22
problemino...
quando inizio a digitare
keytool -genkey -alias alessio -keyalg RSA -validity 7 -keystore alekeystore
mi dice che:
Immettere la password del keystore:
Errore keytool: java.lang.NullPointerException
????
ciao!
ma la password l'hai scritta? :D :D
non ho idea, a me ha funzionato al primo colpo
per i sorgenti li ho dimenticati a casa, ma ti ripeto ho fatto solo le modifiche che avevi gia' fatto tu settimana scorsa!
loveforSCSI
17-09-2002, 18:05
ho sistemato le cose...comunque non ho capito una cosa: il certificato esattamente è un file o cosa?
mi daresti il riferimento dove hai trovato informazioni sul funzionamento di keytool?
ciao!!
loveforSCSI
18-09-2002, 08:52
ok riesco a far funzionare keytool...e anche ad avviare il server...però il client mi crasha dopo aver chiesto nome utente...
probabilmente perchè la porta non può essere qualsiasi
Originariamente inviato da loveforSCSI
[B]ok riesco a far funzionare keytool...e anche ad avviare il server...però il client mi crasha dopo aver chiesto nome utente...
probabilmente perchè la porta non può essere qualsiasi
la porta di default per l'ssl e' la 443 ma puoi fare funzionare il tutto anche su altre porte.
il certificato e' un file (e' quello che generi con l'estensione .cer)
loveforSCSI
18-09-2002, 14:48
tutto a posto lavoro finito e voto registrato (30 !! :):))
se mi mandi il tuo nome in pvt ti metto nei ringraziamenti!
ciao!!
Originariamente inviato da loveforSCSI
[B]tutto a posto lavoro finito e voto registrato (30 !! :):))
se mi mandi il tuo nome in pvt ti metto nei ringraziamenti!
ciao!!
Congratulazioni! :)
mi chiamo Alessio, non occorre un ppvt :o
loveforSCSI
19-09-2002, 10:29
ok...ti posto il link appena pubblichiamo il tutto!
ciao!
Dr.Nasty
25-09-2002, 18:19
Come richiesto da loverforSCSI chiudo la discussione perchè ha esaurito il suo scopo :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.