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