Estoy tratando de elaborar un sistema de mensajería seguro un tanto anónimo, y esperaba que alguien pudiera validar mi enfoque general. Tenga en cuenta que todo esto tiene lugar a través de HTTPS.
Autenticación
Si bien el transporte es compatible con la autenticación de certificado de cliente a nivel de protocolo, no queremos tener que emitir certificados y no queremos firmarlos. Las opciones de mod_ssl / Apache son none, opcional, require, y optional_no_ca - desafortunadamente no hay nada como require_no_ca.
- El cliente genera un par de claves públicas / privadas, ya sea claves RSA de 4096 bits o una clave EC (usando las curvas brainpool P512r1 o NIST P-521).
- El cliente solicita un desafío del servidor y le envía su clave pública.
- El servidor genera un desafío: una gran cantidad de datos aleatorios (por ejemplo, un byte [] 8x el tamaño de bloque del cifrado). El servidor cifra la respuesta con la clave pública del cliente.
- El cliente toma la respuesta, la descifra, genera un hash SHA-512 y la devuelve al servidor.
- El servidor verifica que el hash coincida, y si es así, el cliente está autenticado.
No necesitamos inicios de sesión ni contraseñas, solo certificados de clientes. Si se desea el control de acceso al servidor, los certificados de los clientes podrían incluirse en la lista blanca, o se podría usar la autenticación más tradicional de nombre de usuario / contraseña.
Comunicaciones de cliente a cliente
- Los clientes intercambian claves públicas. Esto tiene todos los viejos problemas de PKI: revocación, etc., en los que realmente no quiero meterme. Así que esto sucede manualmente entre clientes fuera de banda.
- El cliente A envía al servidor una solicitud de intercambio con una clave pública ECDH y la clave pública del remitente, que está cifrada con la clave pública del cliente B. El servidor no tiene un registro del remitente.
- El cliente B se conecta al servidor y solicita cualquier mensaje. El servidor envía el mensaje al Cliente B. El cliente lo descifra y verifica al remitente contra la lista de claves públicas que ya está. Si tiene la clave, genera un par de claves ECDH y envía una respuesta al servidor con la clave pública del par de claves ECDH, que se cifra con la clave pública del Cliente A.
- El cliente A recibe la respuesta de saludo, y desde su cliente A y amp; B puede comenzar a comunicarse utilizando su secreto compartido, a través del servidor. El secreto compartido se utilizará para cifrar los mensajes a través de AES-256 (GCM, sin relleno)
- Otros mensajes generarán nuevos pares de claves ECDH (y, por lo tanto, efímeros), superpuestos a los mensajes anteriores, por lo que la clave AES para el cliente <
El contenido del cliente está todo encriptado para que el servidor no pueda ver los mensajes. Básicamente actúa como un almacenamiento y reenvío de transporte para los mensajes del cliente. La autenticación basada en certificados nos permite enviar mensajes a clientes individuales a pedido.
Me encantaría cualquier comentario.