|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
crittografia e timer in java
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!! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
vi prego una rispostina
![]() |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
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 ![]() |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
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... |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
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. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
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! |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
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 ![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
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!!! |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
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); } } } |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
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.*; ![]() |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
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... |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
sto dando un'occhiata al package (mai usato).
per creare un Socket: Codice:
SocketFactory sf = SSLSocketFactory.getDefault(); Socket s = sf.createSocket("Server", 443); //443 e' la porta standard ssl per creare un ServerSocket: Codice:
ServerSocketFactory ssf = SSLServerSocketFactory.getDefault(); ServerSocket ss = ssf.createServerSocket(443); fatti questi cambiamenti il tuo codice dovrebbe rimanere invariato ![]() |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
grazie....adesso provo...sto usando un ide un po' rompicoglioni (eclipse).....
però la chiave non bisogna specificarla? ciao!! ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
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 ![]() |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
si è opensource....è sul server del mio laboratorio...
se vuoi scaricarlo da lì posso lavorarci.. un certificato? ma cosa è un certificato? |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
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 |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
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.
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
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 |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
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/do...dCustomization Ciao |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jan 2001
Messaggi: 87
|
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 ![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:36.