Hago software para laboratorios de física, y las computadoras en los laboratorios intercambian todo tipo de información entre sí y con las computadoras portátiles de los investigadores, generalmente en una red universitaria. Uso ZeroMQ para la mayoría de las comunicaciones.
Estoy trabajando en usar el cifrado integrado de ZeroMQ para asegurar esta comunicación en una próxima versión de mi software.
El modelo de seguridad de ZMQ es una clave pública criptográfica basada en CurveCP, y estoy siguiendo sus Ejemplo de "ironhouse" con clientes y servidores que verifican la identidad de cada uno a través de las claves púbicas de cada uno.
Sin embargo, la cuestión es que realmente no tengo "clientes" y "servidores" bien definidos, las computadoras involucradas se parecen más a "compañeros". Y pueden ir y venir a corto plazo, y no es práctico distribuir una nueva clave pública a cada computadora con la que la computadora portátil de una nueva persona pueda querer hablar, o distribuir una nueva clave pública cada vez que se establezca una nueva Raspberry Pi. Hasta monitorear alguna pieza de equipo. Automatizar la distribución de claves a través de algún servidor y ssh también es algo que realmente no puedo esperar del laboratorio de física promedio.
Pero creo que "aquí, copie esta cadena base64 a su archivo de configuración en cada computadora que desee para poder hablar entre sí, y trátela como la contraseña de la computadora de laboratorio" es una expectativa razonable.
Para ese fin, ¿puedo dar a todos los compañeros el mismo par de llaves privado / público, y tratar ese par de llaves (o al menos la clave privada) como un secreto previamente compartido? Todos los que tienen las mismas claves no parecen ser muy diferentes a todos los que tienen la contraseña de inicio de sesión en las computadoras del laboratorio (que también suelen ser las mismas), siempre que la criptografía no requiera que dos iguales tengan claves diferentes. Por supuesto, se rompe si alguien filtra las claves, pero eso no es diferente a las contraseñas de las computadoras de laboratorio que están siendo comprometidas, dado que eso le da a todos en la red acceso RDP: tiene que cambiar las claves y avisar a todos en cualquier caso.
No tengo tener un solo par de llaves, es un poco más simple. Podría tener dos pares de llaves, y hacer que cada par decida cuál usar basándose en qué llamadas bind()
en zeromq y cuáles llama connect()
- la diferencia es arbitraria en zeromq pero es una simetría ya rota que podría permitirme definir por convención qué pares utilizan el par de claves 'cliente' y cuáles usan el par de claves 'servidor'. En cualquier caso, estaría distribuyendo las mismas claves privadas a todos, la única pregunta es si distribuyo una o dos.
Habría usado criptografía simétrica con una clave previamente compartida si fuera una opción en ZeroMQ, pero no lo es, e insertar criptografía simétrica en el nivel de la aplicación significa que parte de la información que envía ZeroMQ no se cifraría (previene la información de enrutamiento y ese tipo de cosas) y también dejaría a las aplicaciones vulnerables a los ataques de reproducción, ya que algunos zócalos ZeroMQ son de una sola vía y no le dan acceso al zócalo TCP subyacente, por lo que no puede hacer ningún tipo de protocolo para hacer el criptográfico simétrico usa un sal por sesión o lo que sea.
Entonces, tl; dr ¿está bien que sus compañeros usen pares de llaves idénticos en CurveZMQ?