Algoritmos de cifrado en SSH

El otro día mirando los algoritmos de cifrado en SSH cayó en mi mano un artículo que empezaba con la siguiente frase:

¿Qué es peor que una clave privada insegura? Una clave pública insegura.

Me parece una frase maravillosa y me pareció un tema muy bueno, lo suficiente como para dedicarle un largo rato de estudio al tema.

Como administradores de sistemas sabemos qué es SSH, o como mínimo si no sabemos qué es sabemos para qué sirve y cómo usarlo.

Sabemos que SSH significa «SHell Segura«, Shell es el interprete de comandos, donde escribimos, pero aquí ¿qué significa segura?

Cuando hablamos de «segura» en ssh nos estamos refiriendo a una combinación de hash, cifrado simétrico y cifrado asimétrico.

Así pues ya sabemos lo que es SSH, y lo utilizaremos para conectar clientes y servidores.

SSH se basa en la Infraestructura de clave pública, conocida por sus siglas en inglés PKI (Public Key Infrastructure)

Infraestructura de clave pública:
CA: Autoridad de Certificación
VA: Autoridad de Validación
RA: Autoridad de Registro

A día de hoy los algoritmos criptográficos asimétricos más utilizados en el mundo PKI son RSA, DSA, ECDSA y EdDSA.

Vamos a ver cada uno de ellos y vamos a ver cuando nos interesa usar uno u otro.

Aunque lo primero será saber cómo SSH establece la conexión segura y esto lo hace en la negociación y conexión y posteriormente continuará con la autenticación.

Neogicación y autenticación de SSH

En SSH se podrá establecer la negociación y la conexión siempre y cuando se cumplan una serie de requisitos:

Las versiones de SSH tienen que ser las mismas, aunque lo normal sería que se utiilizara SSH versión 2.0.

Una vez negociada la versión de SSH las máquinas involucradas tendrán que negociar una clave simétrica para cifrar la conexión.

La clave simétrica para cifrar la conexión no es lo mismo que las claves utilizadas para la autenticación, sino que se genera una clave compartida a través del intercambio de claves de Diffie-Helman.

Se utilizan las claves públicas del cliente y la privada del servidor para generar la clave compartida, de esta forma el cliente ya ha autenticado al servidor.

En cuanto a la autenticación se desarrolla una vez que el canal es confiable, en el punto en el que el cliente ha autenticado al servidor, pero el servidor aún no ha autenticado al cliente

Normalmente se utiliza la autenticación de clave pública y esto implica una clave pública y una privada. La gracia es que cualquiera de las dos se puede utilizar para encriptar un mensaje, pero se tiene que desencriptar con la otra.

Lo normal es que si A encripta un mensaje con la llave pública de B, el mensaje sólo lo podrá desencriptar B con su llave privada.

Es con este método con el que se autentica la identidad. Esto tiene el problema de la gestión de llaves, si una llave se distribuye erróneamente: entonces se podrá comprometer dicha llave.

El procedimiento es bastante simple:

  1. El cliente inicia la conexión SSH.
  2. El servidor envía un mensaje aleatório.
  3. El cliente devuelve ese mensaje encriptado.
  4. Si el servidor lo recibe correctamente entonces se produce la autenticación.
Autenticación en SSH

Cifrado asimétrico

La razón por la que el cifrado asimétrico sea tan usado por su fortaleza radica en que con la clave privada se puede obtener la clave pública, pero no al revés, así que la clave pública puede distribuirse sin que exista un riesgo teórico, ahora si se consiguiera romper el cifrado tendríamos un problema, por lo que siempre es recomendable ir cambiando la clave de vez en cuando.

Para generar las claves públicas se pueden utilizar tres tipos principales de cifrado:

  • RSA
  • DSA
  • Curvas elípticas

La integridad de cada una de las opciones viene dada por la naturaleza matemática que constituye el núcleo de cada algoritmo y por tanto la naturaleza matemática utilizada para la generación de las claves públicas.

RSA, DSA, ECDSA y EdDSA

Empezamos por RSA que fue utilizado por primera vez en 1978. La criptografía RSA se basa en la creencia matemática de que factorizar grandes números semiprimos es difícil por naturaleza.

Por ejemplo: factorizar 6 es fácil es 2 * 3, fatorizar 2261 ya es más complicado, pero es 7 * 17 * 19, pero si utilizamos números enormes podemos tardar años porque no existe ninguna formula para factorizar un número compuesto en sus factores primos el tiempo de extracción de la clave es muy elevado.

Por otro lado tenemos DSA, que es un algoritmo más complejo. A groso modo podemos decir que DSA tiene en cuenta un número aleatorio que se utiliza con la firma del mensaje, es decir, va un paso más allá.

Y finalmente tenemos los algoritmos de curvas elipticas.

Al hablar de algoritmos de curvas elípticas nos estamos refiriendo a ECDSA y EdDSA. Estos algoritmos se basan en el supuesto de que no existe una solución eficiente para resolver un problema de logaritmos discretos, igual que DSA.

La diferencia está en que DSA utiliza una operación matemática llamada exponenciación modular y los algoritmos de curvas elípticas usan curvas elípticas.

Las curvas elípticas que se han usado entre otras cosas para solucionar el Teorema de Fermat se definen mediante ecuaciones cúbicas (de tercer grado)

Representación gráfica en un sistema de coordenadas cartesianas de curvas elípticas sobre \mathbb{R}.

Conclusión

Llegados a este punto ya sabemos diferenciar los algoritmos, ahora tendremos que ver cual elegir en cada caso.

En el caso de RSA tenemos la ventaja de que está implementado en todos o prácticamente todos los sistemas ya que lleva entre nosotros 42 años.

Además RSA ha sabido adaptarse perfectamente a la Ley de Moore que define la evolución de la potencia de proceso. En RSA para lograr una seguridad de 128 bits es necesaria una clave con una longitud de 3072 bits.

Cuando hablamos de una seguridad de 128 bits significa que tendríamos que hacer 2 ^ 128 intentos.

En el caso de DSA nos encontramos ante un problema y es la generación de ese número aleatório ya que en computación los números realmente aleatorios son muy complicados de conseguir, así que aquí tenemos un tema que va a hacer que no seleccionemos DSA.

Si hablamos de curvas elípticas nos vamos a encontrar una mayor velocidad manteniendo el mismo nivel de seguridad que con RSA, el problema es que EdDSA no está tan extendido como RSA.

Si tuviéramos que elegir lo suyo sería EdDSA y si en el caso requerido no se pudiera usar porque no fuera soportado por alguno de los extremos entonces iremos a RSA.