Acabo de obtener un concierto PHP5. No manejaré las partes de la aplicación que involucran datos súper confidenciales, pero todavía sé muy poco sobre los métodos de seguridad y encriptación. Solo conozco los conceptos básicos (no almacene contraseñas en texto plano, no permita que los usuarios ejecuten código usando datos de publicaciones, etc.). ¿Qué necesito saber para mantener seguras mis aplicaciones y dónde puedo aprenderlas?¿Qué debería saber todo desarrollador web sobre el cifrado?
Respuesta
Aprender la diferencia entre valores hash y cifrado. Los cifrados generalmente son interpretaciones bidireccionales de una cadena. Puedo encriptar mi contraseña y luego descifrarla en texto plano nuevamente. La idea detrás de hashes es que se conviertan en un 'cifrado' de una sola vía.
En mis sitios guardo las contraseñas como hash. Cada vez que un usuario inicia sesión, vuelvo a codificar la contraseña provista, la prueba contra el hash almacenado en la base de datos y apruebo si coinciden. No puedo enviarles su contraseña si la olvidan, ya que (en general) no tengo forma de saberlo. Dos cadenas diferentes pueden traducirse en el mismo hash, lo que hace que (generalmente) sea imposible saber cuál fue la cadena original.
Este es un problema que es bueno comprender bien y discernir cuándo usar cifrado frente a hash.
El hash de contraseñas como este solo tiene un valor limitado. Claro, no puede ver la contraseña de texto sin formato, pero si el hash es siempre el mismo, no lo necesita para comprometer un sistema con un hombre en el ataque medio. – Thorarin
@Thorarin: ¿Valor limitado? La técnica de almacenar una contraseña hash y compararla con un hash de la contraseña dada es una práctica común. SSL está ahí para evitar un hombre sobre el cable en el medio o un ataque de repetición. Exigir que todos lleven un llavero RSA (o equivalente) sería ideal, pero no es práctico (todavía). Y si el usuario tiene malware en su computadora, están jodidos de cualquier manera, así que ni siquiera vayamos allí. –
Hashing es casi inútil sin sal; haga una búsqueda en Google de 'tablas arcoiris' para ver cómo los valores hash sin sal se pueden comprometer fácilmente. –
En primer lugar hay que familiarizarse con estos métodos PHP:
Here usted tiene todas las extensiones de criptografía en PHP.
md5 es tan bueno como roto hoy en día, debido a las tablas de arcoíris. – Macha
Eso es un poco exagerado. Es suficiente agregar una sal y la mesa del arcoíris es inútil. –
Se han encontrado colisiones MD5. Nadie ha demostrado aún ninguna colisión SHA1. –
La respuesta corta
Nunca se puede estar demasiado seguro
Uso Salted Hashing de contraseñas para mayor seguridad
La respuesta más larga (todavía no está completo, sin embargo)
La seguridad no es algo que aprender con un tutorial rápido en la web. Requiere un conocimiento profundo no solo de las vulnerabilidades que existen, sino también de POR QUE existen y CÓMO funcionan. Uno de los mayores problemas (especialmente en código abierto) es que los nuevos métodos se agregan todo el tiempo, por lo tanto, debemos comprender conceptos de seguridad y teoría.
Lea libros, tome clases y pruebe las vulnerabilidades usted mismo en una máquina local. Luego, lentamente comienzan a comprender el concepto detrás de cómo proteger una aplicación web.
Pagar lo siguiente para que comenzar
Dónde aprender sobre la seguridad: obtener el libro de Schneier Applied Cryptography.
Que se puede romper no importa lo que hagas.
+1 y la verdad en la mayoría de los casos es que escribir tus propias rutinas es una jugada estúpida. – Fredrik
Esto no es informativo en absoluto. Se trata de administrar los riesgos. Tampoco puedes evitar la muerte en los hospitales. En realidad, no puedes evitar la muerte en absoluto. Eso no significa que los hospitales sean inútiles. Por sí mismo, esta declaración no tiene sentido. –
Sepa que no escriba su propia funcionalidad de cifrado. Una biblioteca existente y confiable es la mejor manera de ir donde sea posible. Evite las tecnologías innovadoras que carecen de muchas horas exitosas de programador y horas de usuario detrás de ellas. Sepa que no confíe en la funcionalidad que elija hasta que la haya probado completamente, en primera persona. Manténgase al tanto de los nuevos desarrollos que pueden contrarrestar la funcionalidad elegida durante la noche. Sepa que solo porque está utilizando la mejor tecnología de cifrado disponible hoy en día que no ha protegido nada si deja las claves sobre la mesa (por ejemplo, texto sin formato no está en un caché o almacenado en otra tabla en la misma base de datos, claves privadas dejó a la intemperie)
- entender la diferencia entre encrypting y hashing
- entender la razón de salts
- Entender que HTTP es sin cifrar
- Comprender lo HTTPS es
- understa nd que nunca (casi nunca) podrá crear mejores métodos de codificación o hash que las librerías de terceros y las bibliotecas incorporadas.
Esa tecnología no es el eslabón más débil de la seguridad.
¿Quieres decir, como, la cuenta yahoo de la Sra. Palin? – Smandoli
No estoy de acuerdo, por ejemplo, ahora tengo 4 contraseñas. Creo que si tengo 1 contraseña no necesitaría escribirla, pero solo puedo escribir la contraseña incorrecta 3 veces, así que no puedo recordarla y tengo que escribirla. – IAdapter
@ 01: Este problema se mitigaría si más compañías comenzaran a usar frases * de pase * en lugar de contraseñas. Es mucho más fácil recordar una frase que una cadena aleatoria de caracteres, y mucho más difícil buscar una frase en un diccionario. Esto ** es ** una deficiencia tecnológica, y una que está exacerbando una debilidad humana. –
Por favor, preste atención a los siguientes puntos cuando vaya a guardar las contraseñas,
La contraseña hash es generalmente más segura porque no tiene que guardar un secreto. Sin embargo, le impide utilizar otro esquema basado en hash en su flujo de autenticación. Por ejemplo, no puede usar la autenticación HTTP Digest con contraseña hash.
El hash simple es propenso a atacar la tabla del arco iris (http://en.wikipedia.org/wiki/Rainbow_table). Agregue un nonce no recurrente al hash o use el nonce como clave para HMAC. El nonce necesita ser almacenado con las contraseñas. Lo antepongo al resumen.
Si se utiliza el cifrado, asegúrese de utilizar un Vector inicial aleatorio, de modo que la misma contraseña se codificará en diferentes textos cifrados para diferentes usuarios. De lo contrario, eres propenso al ataque de coincidencia de patrones. MySQL tiene un comando de encriptación incorporado. No inyecta IV así que nunca lo use para contraseñas.
Guarde el nombre/la versión de la clave con el texto cifrado para poder girar las teclas. Se requiere rotación de teclas para cumplir con ciertos estándares. El cifrado sin información clave es imposible de descifrar cuando se ve obligado a cambiar o rotar las teclas.
Si sigues estos consejos, tus contraseñas estarán seguras con cualquier esquema de encriptación/hash.
"Agregue un nonce recurrente al hash" - ¿Quiere decir una sal? – hannson
La sal normalmente se refiere a agregar algo al hash. Nonce es una especie de género que solo puede usarse una vez. –
¿Nonce ?! Ese es un concepto llamado desafortunadamente. – UpTheCreek
Echa un vistazo a Open Web Application Security Project. Tienen mucha información sobre los problemas actuales de seguridad de la aplicación web y sobre lo que debe hacer para defenderse de ellos. OWASP está armando un Development Guide que proporciona mucha información buena sobre aplicaciones web y problemas de desarrollo de servicios web.
Si usted está mirando desde un contexto PHP, me gustaría recomendar este libro:
Lo que me gusta de este libro es que abarca mucho más que solo una lista de las funciones relacionadas con la seguridad en PHP. Una gran parte de este cubre conceptos generales de seguridad web y mecanismos de protección. Permisos, principio de privilegio mínimo, cifrado, hash, scripts entre sitios, falsificaciones de solicitudes entre sitios, secuestro de sesión, etc. están todos cubiertos aquí, con ejemplos de escritura de código seguro en PHP.
Después de haber tomado clases de seguridad de posgrado en la universidad, estoy impresionado con la cobertura de este libro. Considero que es una lectura obligatoria para cualquier desarrollador profesional de PHP.
- 1. ¿Qué debería saber todo hacker Perl sobre perl -ne?
- 2. Scripts de PowerShell que todo desarrollador debería saber
- 3. ¿Qué debería saber un desarrollador web de PHP/MySQL sobre los servidores?
- 4. ¿Qué debería saber un desarrollador experto en C#/.Net/WPF?
- 5. ¿Quién debería saber sobre el otro?
- 6. ¿Qué debería saber sobre excepciones estructuradas (SEH) en C++?
- 7. ¿Qué debe saber todo programador sobre el hardware interno?
- 8. ¿Qué debería saber sobre el rastreo de motores de búsqueda?
- 9. Lo que todo desarrollador de C++ debe saber sobre cómo vincular
- 10. ¿Cuáles son las principales diferencias entre IE7 e IE8 que un desarrollador web debería saber?
- 11. Todo lo que un desarrollador de C++ debe saber sobre la programación de la red?
- 12. ¿Qué debería saber sobre Git antes de comenzar a usarlo?
- 13. Herramientas críticas que todo desarrollador de Java debería tener en su toolbelt.
- 14. ¿Qué debería saber sobre el envío de correos electrónicos en un hilo de fondo? ASP.NET
- 15. preguntas sobre el desarrollo del juego desde el punto de vista del desarrollador web
- 16. Desarrollador de Android moviéndose a iOS: ¿qué necesito saber?
- 17. ¿Qué componentes del framework .Net debería evitar un desarrollador profesional?
- 18. Confundido sobre el cifrado con claves públicas y privadas (que se usarán para el cifrado)
- 19. ¿Qué necesito saber sobre C++ 0x?
- 20. Todo sobre elegir la fuente correcta para un sitio web
- 21. ¿Por qué debería usar Doctrine sobre Zend_Db?
- 22. ¿Cuáles son algunos de los comandos de alimentación que todo usuario de TortoiseSVN/Subversion debería saber?
- 23. ¿Qué versión de Python debería usar para el desarrollo web?
- 24. Todo sobre .... Z-Index?
- 25. ¿Cuáles son los conceptos matemáticos centrales que un buen desarrollador debería saber?
- 26. Cifrado asimétrico
- 27. ¿Saber C y/o C++ me hará un mejor desarrollador?
- 28. ¿Qué es el cifrado XOR?
- 29. ¿Cómo saber qué elemento de arrastre está sobre qué elemento?
- 30. ¿Qué estructura web de Perl debería usar?
¿No debería ser la pregunta "¿Qué debería saber todo desarrollador web sobre la seguridad"? La encriptación es solo una parte de tu pregunta, ¿verdad? –
nyylbharrqgbxabjnobhgrapelcgvbapnaorsbhaqguvegrrapunenpgrefnjnl – Instantsoup
ebg13vffghcvqnaqunfnofbyhgrylabcynprvanqvfphffvbapbirevatfrphevgl – NotMe