¿Cómo selecciono y uso correctamente un cifrado de bloque simétrico moderno?

2

Encontré muchos NO con Google, pero hasta ahora, no hay un recurso simple que explique a alguien como yo que sabe que no es lo suficientemente inteligente como para hacerlo correctamente, sin ayuda sobre cómo usar correctamente un cifrado de bloque simétrico moderno.

Planeo usar esto para intercambiar un montón de mensajes de control a través de un protocolo de transporte orientado a datagramas sin conexión. Planeo distribuir algunos secretos iniciales a través de conexiones http SSH tunelizadas y luego los secretos restantes se distribuirán a través de la red a través de los canales ya seguros. Por lo tanto, es importante para mí tratar de mantener el secreto lo más pequeño posible en el tamaño para que se ajuste a la mayor cantidad posible de ellos dentro de un solo datagrama.

Para resumir, qué cifrado debería seleccionar, cómo debo configurar los IV, los MAC, etc. Alternativamente, una sugerencia sobre los recursos que podrían brindarme los antecedentes suficientes para tomar estas decisiones yo estaría bien, pero todavía estoy luchando por Encuentra algo que sea más práctico que los libros de texto criptográficos.

    
pregunta mathieu 21.12.2012 - 22:57
fuente

2 respuestas

5

Esto probablemente debería estar en el Crypto Stack Exchange en lugar de aquí.

Independientemente, el mejor curso de acción es no tocar el cifrado de bloque simétrico. Hay bibliotecas de seguridad maduras y criptógrafas auditadas, como NaCl y KeyCzar que tomará las decisiones correctas por ti.

Dicho esto, si do elige hacerlo por su cuenta, una opción generalmente segura es AES-128 en modo EAX o modo GCM. Ambos modos proporcionan la autenticación de su texto cifrado además de la seguridad criptográfica, que es crucial para evitar cosas como el relleno de ataques de Oracle. Para utilizar cualquiera de estos modos, necesita una clave criptográfica, un vector de inicialización, un texto plano y, opcionalmente, datos de autenticación adicionales.

La clave debe debe tener una longitud de 128 bits y debe generarse con un generador de números aleatorios criptográficamente seguro. Si desea una clave protegida con contraseña, tome la clave generada aleatoriamente y pásela a través de PBKDF2-HMAC-SHA-256 con la contraseña, la clave en lugar de la sal, una serie de rondas calibradas para que le tomen el tiempo necesario. Estoy cómodo con (10_000 rondas en mi computadora portátil requieren 0.5s, que es un tiempo razonable) y un tamaño de salida de 128 bits. La salida será la clave "real" que se usará, y puede volver a ejecutarla con la clave y la contraseña originales cada vez que necesite acceder a la clave real.

El vector de inicialización para los modos EAX y GCM (nota: esto no puede ser el caso de otros modos, como CBC, que tiene requisitos IV más estrictos) debe ser único en todos los cifrados con un determinado llave. Un contador simple se considera suficiente. Sin embargo, debe asegurarse de que este contador garantice la exclusividad incluso cuando se ejecuta a través de múltiples invocaciones del proceso, múltiples procesos simultáneos y múltiples máquinas. Un adecuado versión 1 UUID debería ser suficiente para estos fines. Sin embargo, esto no está en el formato recomendado por RFC 5116, sección 3.2 , y alguien con más conocimientos que yo Hay que aclarar si ese formato es importante o no. Alternativamente, un número aleatorio generado de forma segura y de tamaño apropiado debería ser suficiente, pero no he visto a la gente hacer esto en la práctica con los modos derivados de CTR (en los que se basan GCM y EAX). Una vez más, alguien con más conocimientos tendrá que comentar si es una buena idea o no.

El texto en claro puede ser lo que quiera, pero no caiga en la trampa de pensar que la entrada de AES es "caracteres", "ASCII", "Unicode" o cualquier otra tontería. La entrada adecuada es una matriz de bytes .

Los datos de autenticación asociados opcionales también pueden ser cualquier cosa que desee. Estos son datos que se incorporan en el texto cifrado para verificar la autenticidad cuando se realiza un descifrado. Pero no es parte del texto plano protegido dentro del texto cifrado. Por ejemplo, si está cifrando datos en nombre de usuarios almacenados en una base de datos, podría usar user_id del usuario en la base de datos. En el caso de que un usuario encuentre una manera de copiar los datos encriptados de otro usuario en su cuenta, no podrá lograr que su aplicación la descifre, ya que su user_id no coincidirá con la utilizada para cifrar los datos. Es posible que haya explicado esto de manera deficiente, así que avíseme si fue confuso o no está claro.

Para el almacenamiento, la clave debe debe mantenerse en secreto. La administración de claves y la vida útil están fuera del alcance de mi respuesta, pero es una parte crucial para garantizar la seguridad de sus datos protegidos. El vector de inicialización, el texto cifrado y los datos de autenticación no tienen ningún requisito sobre su secreto, pero lo ideal sería que los datos de autenticación se proporcionen a la capa de criptografía desde una fuente externa (por ejemplo, el user_id mencionado anteriormente). Cuando se usa, no debe ser algo que un atacante potencial pueda suministrarle o de lo contrario ejercer el control. Almacenar, transmitir y copiar los datos de autenticación junto con los demás valores anula el propósito. Una forma de considerar los datos de autenticación es que debe proporcionar "contexto" para los datos protegidos.

Eso debería hacerlo. Tenga en cuenta que esto es complicado y que es extremadamente difícil hacerlo correctamente sin filtrar información protegida. No te recomiendo que lo hagas solo, pero si lo haces, lo anterior debería ser un punto relativamente seguro para comenzar. Como mínimo, debería estar mejor que el 95% de los sitios web que intentan implementar la criptografía ellos mismos. Suponiendo, por supuesto, que no he fallado completamente al describir un enfoque de implementación seguro.

    
respondido por el Stephen Touset 22.12.2012 - 01:42
fuente
1

La mejor manera de usar un cifrado de bloque es: no . En su lugar, utilice un nivel más alto de abstracción.

Siga los consejos en No enrolle su propio criptográfico. Para los datos en movimiento, use TLS. Para datos en reposo, utilice GPG. Si no puede hacerlo, use una biblioteca criptográfica de alto nivel, como cryptlib , GPGME, Keyczar o NaCL .

    
respondido por el D.W. 04.01.2013 - 02:49
fuente

Lea otras preguntas en las etiquetas