¿Qué deben saber los programadores web sobre criptografía? [cerrado]

27

¿Deben los programadores que crean sitios web / aplicaciones web entender la criptografía? No tengo idea de cómo funcionan la mayoría de los algoritmos criptográficos, y realmente no entiendo las diferencias entre md5 / des / aes / etc. ¿Alguno de ustedes ha encontrado la necesidad de una comprensión profunda de la criptografía?

No lo he necesitado, pero me pregunto si quizás me estoy perdiendo algo. He usado salt + md5 hash para cifrar contraseñas, y le digo a los servidores web que usen SSL. Más allá de eso, no puedo decir que he usado mucho más, ni puedo decir con certeza cuán seguros son estos métodos. Solo los uso porque otras personas afirman que están a salvo.

¿Alguna vez ha encontrado la necesidad de utilizar la criptografía en la programación web aparte de estos dos ejemplos simples?

davidhaskins
fuente
44
Deberían saber lo suficiente como para saber que no deberían hacerlo.
SLaks
@SLaks: +1 100% de acuerdo. Escribí una respuesta a este hilo para ampliar por qué es esto.
Chris Jester-Young

Respuestas:

41

Los programadores web deben saber que nunca deberían intentar implementar la criptografía ellos mismos.

En particular, eso significa que ningún experto en seguridad no debe tocar ninguna de las primitivas criptográficas directamente. No deberían estar pensando en el nivel de AES, SHA-1, etc. En su lugar, deberían estar utilizando funciones de alto nivel para cifrar y firmar mensajes, y para contraseñas "hash".

¿Por qué? Porque de lo contrario, las personas se engañan al pensar que:

  • AES-256 es "excelente encriptación", a pesar del hecho de que lo están usando en modo ECB, o usando valores IV no aleatorios, etc. (En algunos modos, IV no aleatorios pero únicos está bien. En otros, no tanto.)
  • Pueden usar la misma clave simétrica para encriptar múltiples mensajes (o peor, almacenar la clave simétrica en el código para uso directo).
    • Incluso podrían decidir usar una frase de contraseña como clave directamente, sin utilizar ninguna función de derivación de clave.
  • Pueden usar RSA para cifrar datos directamente.
  • Simplemente pueden "sal y MD5" sus contraseñas para mantenerlos a salvo. (Si crees que las tablas del arco iris son el eslabón más débil, piénsalo de nuevo ).

Solo para estar en la misma página, ninguno de los elementos anteriores está bien . Si no obtienes eso, ¡entonces no deberías tocar criptografía con un poste de 10 pies! (AES-256 es un excelente cifrado, pero solo si lo usa correctamente. "No es el tamaño lo que importa, es lo que hace con él" :-))

¿De qué tipo de funciones de alto nivel estoy hablando? Yo personalmente recomiendo el uso de una biblioteca OpenPGP (para datos en reposo) o SSL (para datos en movimiento). Estos protocolos especifican rígidamente el uso correcto de algoritmos asimétricos, simétricos y hash. Por ejemplo, con OpenPGP:

  • No utiliza RSA para cifrar datos directamente, sino que genera una clave de sesión aleatoria (simétrica) por mensaje (esto es importante), y utiliza RSA para cifrar esa clave de sesión.
  • Utiliza una función de derivación de clave para transformar frases de contraseña en claves. (En el lenguaje OpenPGP, se llama S2K, pero creo que "función de derivación de clave" es el término más estándar).
  • Se encarga de elegir un buen modo, por lo que nunca terminarás usando el BCE.
  • Maneja la administración de claves por usted, por lo que no tiene que tomar decisiones ad-hoc sobre qué claves son confiables, etc.

Resumen: si no eres un experto en seguridad y estás pensando en el nivel de AES, SHA-1 o (Dios no lo quiera) MD5, lo estás haciendo mal . Use una biblioteca escrita por expertos en seguridad (como Bouncy Castle), que implemente protocolos diseñados por expertos en seguridad (como OpenPGP para el cifrado, o bcrypt o scrypt para el hash de contraseña), en lugar de crear el suyo.

No soy un experto en criptografía de ninguna manera, pero sé lo suficiente como para no tratar de diseñar mis propios protocolos ad-hoc. Para ser claros, toda esta publicación es material de Cryptography 101 . Entonces, si esta publicación no tiene un 100% de sentido para usted, entonces definitivamente no debería acercarse a la criptografía.

Chris Jester-Young
fuente
44
increíble. Me encantó la publicación del blog vinculada a "pensar de nuevo". chargen.matasano.com/chargen/2007/9/7/…
davidhaskins
+1, pero usar la misma clave simétrica varias veces está bien. Para eso está el IV (de lo contrario no lo necesitarías).
orip
1
Además, Colin Percival de scrypt (y otros) fama tiene un gran artículo llamado "Respuestas correctas criptográficas" que expone las decisiones criptográficas que debe tomar. SSL es muy problemático (la revocación de claves es muy difícil de implementar). Más información aquí: daemonology.net/blog/…
orip
@orip De acuerdo, aunque diría que usar la misma clave con un IV diferente suele ser más útil para el caso en el que su mensaje es más largo que el tamaño de bloque del cifrado simétrico elegido, en lugar de para mensajes distintos, donde no tendría contexto para realizar un seguimiento de los IV utilizados para mensajes anteriores. Además, de acuerdo con el artículo de Colin Percival.
Chris Jester-Young
1
@Disfrute, he cambiado el enlace a algo más relevante.
Chris Jester-Young
14

No necesita saber nada más que lo básico sobre la criptografía (qué es un hash, qué es una sal, aproximadamente qué tan difícil es descifrar este cifrado o eso, etc.), pero debe saber un poco sobre la seguridad en general.

Las principales áreas de seguridad que definitivamente debe tener en cuenta como desarrollador web:

  1. Inyección SQL. Este es probablemente el agujero más peligroso que un desarrollador web puede hacer en un sistema.
  2. Cross-site scripting y cookies.
  3. Spambots y captchas.
  4. Inyección SQL. No se puede enfatizar lo suficiente lo importante que es esto.
biziclop
fuente
No entender nada sobre lo que estás haciendo es muy peligroso. No saber cuál es la diferencia entre un resumen de mensaje y un resumen criptográfico puede arruinarlo. No saber cómo la sal puede arruinarte.
Incognito
@ user1525 A eso me refería como lo básico de la criptografía. Definitivamente no necesita saber cómo funcionan realmente los algoritmos de cifrado.
biziclop
Agradezco la respuesta, y estoy de acuerdo con la inyección SQL y otros ataques, pero realmente estaba preguntando acerca de la criptografía.
davidhaskins
2
@davidhaskins Sí, pensé que valía la pena señalarlo, porque cada nivel se basa en el anterior. Saber cómo funciona AES no vale nada si no puede asegurar su aplicación en un nivel más básico. En mi experiencia, esta es una trampa en la que caen muchos desarrolladores (lo hice varias veces), para concentrarme en el cifrado y perder de vista su papel en la larga cadena de seguridad.
biziclop
4

Recuerdo haber visto esta charla llamada Lo que todo ingeniero necesita saber sobre la seguridad y dónde aprenderla , el orador es Neil Daswani y es una charla técnica de Google que dio, ¡podría ser un buen lugar para comenzar!

Sin embargo, no se aplica solo a los programadores web, tal vez la pregunta debería titularse "¿Qué deben saber los programadores sobre seguridad?" ya que no necesitan saber más que lo básico sobre criptografía (tan interesante como es)


fuente
2

Crypto es útil en muchas situaciones. Un ejemplo que hemos usado es encriptar una cookie de sesión creada y configurada por un host Win / IIS para ser utilizada en un host LAMP.

Si va a implementar el cifrado (a diferencia del hash md5 / sha1), algunos términos básicos son importantes, como la diferencia entre el cifrado simétrico y asimétrico. Además de comprender la diferencia entre los dos, debe desarrollar una comprensión de lo que usted, como desarrollador web, debe hacer para almacenar y proteger adecuadamente las claves de descifrado. Por ejemplo, si desarrolla una aplicación para implementarla en un host sobre el cual no tiene control administrativo completo, como un host compartido, en lugar de implementarla en un servidor donde todos los administradores son conocidos y confiables.

Miguel
fuente
2

En mi opinión, debes saber todo sobre la criptografía que alguien que ataca tu código sabrá. Debe comprender los hashes, la sal, la no aleatoriedad del azar, los principales algoritmos de cifrado (RSA, 3DES, AES, etc.), SHA-1 / MD-5 / et al. No tiene que memorizarlos, pero al menos debe saber que la efectividad de un algoritmo hash y cómo hacerlo más fuerte. Debe saber qué son las colisiones y los falsos positivos. No debería poder recitar los algoritmos de cifrado, pero debería estar familiarizado con sus puntos de referencia, cuáles son ideales para qué escenarios. Debería poder describir y explicar el cifrado simétrico frente al cifrado asimétrico y cuándo utilizar cada uno. Debe saber qué es PKI y cómo se usa. Debe saber qué es una autoridad de certificación y cómo interactúa con sus servidores.

Conocer los entresijos de todo no es tan importante como conocer sus antecedentes. ¿Cuáles son los puntos de referencia de ciertas cosas (qué tan rápido, qué tan fuerte, debilidades, etc.).

Estas recomendaciones son para información de nivel superior o de arquitecto. Si solo eres un mono web remando un remo, no necesitas saber nada de esto. Su arquitecto debería saber esto. Si está a cargo del sitio, diseñándolo, implementándolo, etc., entonces debe estar familiarizado con todos estos conceptos y ser capaz de conversar de manera inteligente sobre ellos. No es necesario que pueda enseñarlo, simplemente acepte y difunda información al respecto.

Joel Etherton
fuente
2

Debe usar bcrypt (Blowfish) para almacenar contraseñas en lugar de MD5; es un algoritmo mucho más lento , lo que significa que es mucho más difícil para un hacker adivinar y verificar. Además, bcrypt toma un factor de trabajo como parámetro, lo que significa que puede volverse aún más lento a medida que se introducen las computadoras más nuevas, por lo que tiene incorporadas pruebas para el futuro.

Consulte Cómo almacenar una contraseña de forma segura para obtener más información.

chrisaycock
fuente
0

Como una respuesta bastante general a este tipo de preguntas, siempre pienso que debes tratar de tener una comprensión básica de cualquier cosa que esté remotamente relacionada con lo que haces. Por supuesto, necesita un conocimiento detallado específico de lo que realmente está trabajando. Es muy difícil predecir cómo evolucionará un área determinada, qué va a estar "de moda" o lo que necesitará en el futuro, por lo que tener un área amplia de cosas que al menos "ha escuchado" mantendrá Muchas puertas se abren.

En cuanto a mi experiencia personal en programación web, encontré nociones básicas de criptografía asimétrica y esas cosas útiles para comprender lo que está sucediendo bajo el capó. Podría haber sobrevivido sin él, pero debo decir que disfruto de la criptografía y las matemáticas, ¿por qué no?

Omar Kohl
fuente