Si tiene OpenSSL, use SSL / TLS: el protocolo que es más sencillo de implementar es el que ya está implementado. SSL solo ofrece un túnel sin formato, por lo que tendría que incluir algún tipo de protocolo de administración que organice la "transferencia de archivos" real, por ejemplo. HTTP. HTTP dentro de SSL se conoce como HTTPS: eso es estándar, por lo que el trabajo duro de especificar el protocolo ya está hecho.
Sin OpenSSL, todavía recomendaría personalmente SSL / TLS por el siguiente motivo: lo he hecho (cliente y servidor SSL para sistemas integrados, cada uno de ellos encaja en menos de 20 KB de código). Así que sé que es factible. Además, hay otras bibliotecas SSL / TLS dirigidas a sistemas pequeños, por ejemplo, CyaSSL o axTLS .
La reimplementación del protocolo SSH no debería ser mucho más difícil que la reimplementación de SSL, pero la especificación de SSH es mayor (comienza en RFC 4251 , que describe la arquitectura, y el protocolo real se extiende sobre varios RFC subsiguientes; por otra parte, SSL / TLS encaja en el único RFC 5246 ). Obviamente, esa es una forma no muy objetiva de elegir un protocolo, pero tampoco está totalmente fuera de lugar.
Para SSL / TLS, sugiero lo siguiente:
-
Use TLS 1.2 y no se moleste con las versiones anteriores (usted controla el cliente y el servidor, por lo que puede imponer una versión específica). TLS 1.2 requiere la implementación de una sola función hash, mientras que las versiones anteriores requerían tanto MD5 como SHA-1.
-
Use una única suite de cifrado (por ejemplo, TLS_RSA_WITH_AES_128_CBC_SHA256
). Esto simplifica un poco las cosas y te permite codificar cosas como el tamaño del bloque o la longitud del MAC.
-
Use el intercambio de claves RSA y haga que su sistema sea el "cliente": esto le permite usar RSA solo en modo de encriptación, lo que es notablemente más sencillo de implementar que el descifrado. Además, el cliente no necesita almacenar una clave privada asimétrica, lo cual es bueno ya que el almacenamiento seguro de claves es difícil.
-
No intente decodificar certificados. En SSL / TLS normal, el servidor envía su clave pública al cliente como parte de una cadena de certificados X.509; Se supone que el cliente debe validar la cadena con respecto a una clave pública codificada. Solo corte el intermediario y codifique la clave pública del servidor en el cliente (la validación de la cadena de certificados X.509 puede hacerse, incluso en 6 KB de código, pero es absolutamente complicado).
De cualquier manera, sin una biblioteca criptográfica a mano, tendrá que volver a implementar algunos algoritmos básicos, y se sabe que no es fácil (especialmente si quiere evitar ataques de canal lateral , que siempre son una preocupación para los sistemas integrados). También necesitará acceso a una fuente criptográfica segura de un número aleatorio: en un sistema previo al inicio, esto puede resultar difícil. Pero es extremadamente importante para la seguridad.