Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79

    Chiavi pubbliche e private con RSA

    Salve a tutti, sto realizzando un'applicazione in php(con l'appoggio ad un db mysql).
    L'applicazione è semplice, con un sistema di login e permette lo scambio di messaggi tipo mailbox.
    Ad un certo punto un utente Mittente deve mandare un messaggio ad un altro utente Destinatario. Creo il messaggio, lo salvo nel DB(ho una tabella che fa una sorta di mailbox molto rudimentale), e quando l'utente Destinatario si loggerà, leggerà il suo messaggio.

    E fin qui, la gestione dei messaggi(come una sorta di "mail"), va tutto bene.
    Ora mi è stato detto che per rendere migliore l'applicazione dovrei far si che i messaggi siano criptati, e guardando in giro ho visto che il metodo migliore basandosi a semplicità/efficienza è quello basato sulle chiavi pubbliche e private RSA.

    Quello che ho fatto è questo:

    codice:
    require_once "../Crypt/RSA.php";
    
    //imposto la chiave di lunghezza 128 bit
    $key_length_Mitt=128;
    $key_length_Dest=128;
    
    //Le chiavi calcolate hanno effetto solo per la sessione corrente
    echo"Session_id: ".session_id()."
    
    ";
    
    //creo la coppia di chiavi pubblica e privata
    $key_pair_Mitt = new Crypt_RSA_KeyPair($key_length_Mitt);
    $key_pair_Dest = new Crypt_RSA_KeyPair($key_length_Dest);
    
    $public_key_Mitt = $key_pair_Mitt->getPublicKey();
    $private_key_Mitt = $key_pair_Mitt->getPrivateKey();
    $public_key_Dest = $key_pair_Dest->getPublicKey();
    $private_key_Dest = $key_pair_Dest->getPrivateKey();
    
    //istanzio un oggetto di classe Crypt_RSA
    $rsa_obj = new Crypt_RSA();
    
    //Questo è il testo in chiaro da criptare
    $plain_text = "Hello World !!!";
    //cifro il testo usando la chiave pubblica del destinatario: fase 1
    $enc_text=$rsa_obj->encrypt($plain_text, $public_key_Dest);
    //creo la signatura tramite la chiave privata del mittente: fase 2
    $signature=$rsa_obj->createSign($enc_text,$private_key_Mitt);
    codice:
    // se la signatura è valida(cioè se arriva da quel mittente):passo3
    if ($rsa_obj->validateSign($enc_text, $signature, $public_key_Mitt))
    {
      //decripta il messaggio con la chiave privata del destinatario: passo 4
      $mex= $rsa_obj->decrypt($enc_text, $private_key_Dest);
    }
    Ecco alcune considerazioni:
    - la coppia di chiavi generata ad ogni sessione cambia, nel senso che se carico più volte un file che genera le chiavi, ogni volta genera chiavi diverse

    - le due porzioni di codice sono su due file diversi(teoricamente la prima parte è su un file che userà il mittente, e la seconda parte su un file che userà il destinatario).

    - tutte le chiavi pubbliche sono accessibili a tutti, mentre le chiavi private le devono conoscere solo i proprietari (considerazione banale ma ho voluto sottolinearla).

    Ora iniziano i dubbi:
    - quando genero le chiavi? In che fase dell'applicazione le devo generare?
    - come faccio a salvare le chiavi? Per quanto riguarde quelle pubbliche ho pensato di poterle salvare nel db, avendo una tabella che contiene dati di ogni utente gli posso aggiungere un campo, ma per quanto riguarda quella privata, come posso salvarla in maniera tale che solo i proprietari la conoscano?

    Avete suggerimenti per risolvere questi due dubbi?
    Scusate se non sono stato sintetico...
    Grazie

  2. #2
    Potevi aggiungere questo nelle mia discussione "delucidazioni: sicurezza e autenticazione"...
    Comunque, il protocollo https esegue per te le seguenti operazioni:

    1) Il client e il server devono avere ciascuno una loro coppia di chiavi (quindi due coppie di chiavi in totale)

    2) Il client cripta il messaggio con una chiave segreta "X" (crittografia simmetrica)
    3) Il client cripta la chiave segreta "X" con la crittografia asimmetrica:
    a) cripta la chiave segreta "X" con la la chiave pubblica del server
    b) cripta di nuovo la chiave segreta "X" con la propria chiave privata
    4) Il client cripta con algoritmo di hashing (md5 o sha1) sia il messaggio che la chiave segreta (checksum)

    5) Il client invia messaggio crifrato, chiave segreta cifrata e checksum al server

    6) Il server controlla che checksum sia uguale a messaggio e chiave segreta (integrità)
    7) Il server decripta la chiave segreta con la chiave pubblica del client (autenticità garantita)
    8) Il server decripta di nuovo la chiave segreta con la propria chiave privata (confidenzialità)
    9) Il server decripta il messaggio con la chiave segreta decrittografata!

    quindi io utilizzerei il protocollo https, senza quindi dover creare nessuna chiave, senza pormi nessun problema...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    Ok ho capito... Grazie...
    Per poter utilizzare https basta che scrivo https al posto di http nella barra indirizzi o devo mettere qualcosa in qualche parte del codice...
    Scusami ma in fatto di sicurezza sono davvero alle prime armi....

  4. #4
    Siamo allo stesso livello allora! La mia esperienza nell'ambito della sicurezza è vicina allo zero!
    Comunque... devi utilizzare la libreria cURL (consulta il manuale di PHP).
    Attenzione, se lavori in locale, devi prima configurare Apache (o il tuo server web) per la gestione https!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    Si lavoro su apache.... ho scaricato la versione no SSL...
    come lo setto per https?

  6. #6
    Non ho mai fatto questa operazione.
    Ma proprio su questo sito ho trovato questa guida:
    http://server.html.it/articoli/leggi...essioni-https/
    (comunque cerca su Google "configurare apache ssl https")

    Se ti serve aiuto devi sperare che qualcuno più esperto di me participi a questa discussione.
    Prova a seguire la guida e fammi sapere come va!

    PS non vorrei darti cattivi consigli, ma dato che i vari hosting hanno già configurato sui loro server le connessioni https, forse ti conviene il locale utilizzare soltanto http, e poi aggiungere le opzioni di SSL a cURL solo prima di postare gli script sull'hosting... in pratica il locale lavora solo con http! (ma ripeto... io non sono un esperto... quindi non ti fidare troppo di me)

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    In poche parole io ho un file index che fa da menu principale anche dove l'utente si logga, e poi un file per ogni sezione del menu....
    Una di queste e' il file per la "mailbox" dove un mittente scrivera' un messaggio, che verra' depositato nel db, e quando il destinatario si loggerà(avendo una notifica di un nuovo messaggio) andra' nella sezione mailbox e recupererà dal db il suo messaggio.
    Il problema e' che e' tutto in chiaro, e per criptarlo il mio dubbio era:

    - in che momento vanno generate le coppie di chiavi?

    - dove e come salvo fisicamente le chiavi?

    L'esempio che ho riportato è una prova che ho fatto tutto in un unico file, e quindi il messaggio è criptato e decriptato in un'unica esecuzione del file, invece io devo farlo che cripta quando scrive il mittente e decripta quando il destinatario si loggerà e vorrà leggere il messaggio, magari anche giorni dopo....

  8. #8
    - in che momento vanno generate le coppie di chiavi?
    La mia prima risposta a questa discussione ti diceva:
    1) Il client e il server devono avere ciascuno una loro coppia di chiavi (quindi due coppie di chiavi in totale)
    quindi è la prima cosa che devi fare...

    - dove e come salvo fisicamente le chiavi?
    le chiavi le salvi in dei file con estensione .pem (manuale PHP -> openSSL)

    Il problema e' che e' tutto in chiaro, e per criptarlo il mio dubbio era:
    Il messaggio lo devi criptare con crittografia simmetrica e non asimettrica!!!
    La crittografia asimmetrica si utilizza soltanto per l'autenticazione... per questioni legate alle performance... rileggi con molta attenzione i 9 punti che ti ho elencato alla prima risposta!!! e se qualche passaggio non ti è chiato chiedi pure...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    79
    Ok quindi se io imposto connessione https fa gia' tutto lui?
    cioe' posso lasciare quel codice, senza aggiungere alcuna riga riguardante la criptazione?

    Io lavoro su apache, e quindi da come ho capito devo scaricare una versione con ssl e impostarla opportunamente(con tanto di curl abilitate)...

    Hai il link a una guida per impostare e usare https (solo se ce l'hai già a portatata di mano, nn voglio scocciare troppo )...

  10. #10
    Come ti ho già detto basta una piccola ricerca, da Google: "configuring apache with sll under YOUR OS"
    (al posto di "YOUR OS" scrivi Windows o Ubuntu o Debian o Mac...)
    Ok quindi se io imposto connessione https fa gia' tutto lui?
    Ti ho già detto due volte di SI! questa è la terza...
    cioe' posso lasciare quel codice, senza aggiungere alcuna riga riguardante la criptazione?
    tramite https tu devi inviare user + password + messaggio.
    passi ad https i seguenti valori:
    user -> in chiaro
    password -> md5 o sha1
    messaggio -> in chiaro
    perchè user e messaggio verranno decriptati da ssl!
    password verrà criptata la prima volta da te (md5 o sha1) e poi una seconda volta da ssl!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.