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.