Sto cercando di implementare il mio meccanismo di sicurezza piuttosto che usare SSL perché SSL è 'disperatamente rotto ' e anche perché è un esercizio interessante :)
Questo è per un'applicazione internet client-server.
Caveat - Non sono un esperto di sicurezza - ho appena letto sulla sicurezza.
Creerò anche l'applicazione client, quindi avrò il controllo dell'implementazione su entrambi i lati.
Problema SSL
Il problema principale che vedo con SSL è dovuto allo scambio di chiavi pubbliche nella fase di handshake e un uomo nel mezzo che intercetta questo. SSL tenta di evitare questo problema utilizzando la firma di messaggi e certificati ecc per convalidare la chiave pubblica del server per il client. Ma un attaccante con un certificato contraffatto può ancora aggirare questo.
Soluzione
A causa di questo problema di scambio sicuro di chiavi pubbliche, penso che questo possa essere evitato semplicemente non dovendo scambiare la chiave pubblica del server, avendo "conosciuto" la chiave pubblica del server incorporata in ogni applicazione client. Pronuncia una chiave RSA a 3072 bit.
Attuazione
- L'implementazione per ogni sessione di comunicazione sarebbe quindi il client genera una coppia di chiavi RSA pubblica / privata Il client
- crittografa la sua nuova chiave pubblica con la chiave pubblica del server e la invia al server Il server
- decrittografa il messaggio per scoprire la chiave pubblica del client e quindi lo utilizza per crittografare le risposte al client Il client
- continua a inviare traffico al server crittografato con la chiave pubblica del server
- ogni messaggio inviato dal client contiene anche nell'intestazione:
- il nome utente del client crittografato con la chiave pubblica del server
- un hash del messaggio client non crittografato - utilizza come input per generare questo hash, un altro hash di [nome utente + realm + password client]
Osservazioni
- Il server può dimostrare l'identità del client decodificando prima il messaggio utilizzando la sua chiave privata e quindi calcolando l'hash del messaggio non crittografato utilizzando l'hash di [nome utente + password + password] che ha memorizzato nel suo database.
- L'uomo nel mezzo non può monitorare il traffico poiché è crittografato in entrambi i modi
- L'uomo nel mezzo non può rappresentare un client perché non può generare un hash del messaggio valido
- L'uomo nel mezzo non può rappresentare un server perché poiché non può decrittografare il messaggio iniziale, non può scoprire la chiave pubblica del client in cui crittografare le risposte al client
- La password del client stessa è protetta dallo scrutinio della forza bruta poiché l'hash che utilizzava la password del client come input è contro il messaggio non crittografato, quindi l'attaccante dovrebbe prima decodificare il messaggio prima di iniziare un attacco di forza bruta contro questo hash
Visto che non sono un esperto di sicurezza spero che qualcuno che sa qualcosa di più sulla sicurezza possa individuare eventuali buchi in questo approccio, o confermare se è buono. E anche se una chiave RSA a 3072 bit può sopportare il test del tempo senza essere interrotta.
Grazie!