ho una chat e vorrei crittograffare tutto quello che viene spedito sui canali di comunicazione. Come posso fare?? Devo implementare tutto io o posso agganciarci un programma di crittografia???
ho una chat e vorrei crittograffare tutto quello che viene spedito sui canali di comunicazione. Come posso fare?? Devo implementare tutto io o posso agganciarci un programma di crittografia???
puoi usare il provider crittografico di Sun(poco vasto) o meglio ancora il bouncy castle.
Per rendere sicuro un canale o usi SSL(java ha una libreria per questo, trovi tutto sul sito di sun) o usi un key agreement.
Cerca info su queste tecniche magari domani butto giù qualche riga di codice e altri sistemi per rendere sicuro un canale chat:checaldo:
![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)
sto facendo adesso una chat con canale sicuro, utilizzo RSA praticamente genero una chiave pubblica del client che la invierà al server, il quale a sua volta creerà la sua chiave pubblica e la invierà al client. Sia i server sia i client naturalmetne avranno anche la loro chiave privata, a questo punto i dati vengono cirfati con la chiave pubblica del destinatario e il destinatario li decodifica con la sua privata che non è stata mandata per la rete per evitare intercettazioni(se uno prende la pubblica può solo codificare).
Le chiavi le generi così:
Per ripristinare la chiave codificata(con getEncode) devi usare la classecodice:import javax.crypto.*; import java.security.*; import java.security.spec.*; ... private KeyPairGenerator kpg; private KeyPair kp; private PublicKey serverPublicKey; private PublicKey myPublicKey; ... private void doSafeTheChannel() { try { kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(1024); kp = kpg.generateKeyPair(); myPublicKey = kp.getPublic(); bos.write("/KEY|"+myPublicKey.getEncoded()); } catch (Throwable t) { t.printStackTrace(); } }
X509EncodedKeySpec per la pubblica
Questo con il JCE di Sun standard(in teoria dal jdk 1.3 in poi c'è RSA, io uso la 5) quindi presente nella documentazione.
![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)
grazie mille proverò
navigando per la rete ho letto che ci sono 3 aspetti della crittografia: digest, signature e poi vari algoritmi per fare la cifratura (des, rca,....).
Devo usare anche i primi 2 o mi bastano gli algo per la cifratura dell'ultimo punto??
ti posto anche il link
http://www-lia.deis.unibo.it/Courses/SicurezzaCE/5-crittografiaJava.html
Un digest e una signature non sono dei sistemi di cifratura, il primo da una stringa univoca per ogni stringa in entrata, il secondo genera una stringa che è un'impronta, come il digest, autenticata con la chiave di chi vuole garantire che è lui a scrivere il messaggio.
Per quello che vuoi fare tu, ovvero evitare il caso "man in the middle" come ad esempio uno sniffer che prenda i dati che passano tra client e server, si può usare solo la cifratura, ovvero fare in modo che quando i dati sono fuori dal client e fuori dal server siano incomprensibili, se usi anche l'autenticazione quello che cambia è che il server oltre che decifrare i dati controlla anche se arrivano da un client autorizzato che firma i suoi messaggi ma il canale deve essere già sicuro perchè se uno si mette tra client e server può intercettare i dati firmati e farsi riconoscere come autorizzato.
Per risolvere questo tipo di problema sicuramente si usa la cifratura asimmetrica(RSA appunto) però questo tipo di cifratura ha un processo molto lento anche se vengono usati trucchi metematici di calcolo per accellerarlo, per questo potresti anche usare cifratura simmetrica e assimetrica assieme creando una chiave di sessione: praticamente il messaggio viene codificato con un algoritmo simmetrico e la chiave(univoca per cifrare e decifrare) codificata asimmetricamente, server e client si scambiano chiavi pubbliche messaggio e chiave cifrata.
Cmq io uso RSA normale senza chiavi di sessione visto che un messaggio in chat è più corto di una chiave quindi si potrebbe ottenere l'effetto contrario.
![]()
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)