Ya pregunté esto en StackOverflow pero me sugirieron que este sería un lugar más adecuado y no encontré la forma de "mover" la pregunta, así que tengo que copiarla.
Créeme, lo sé, hay cientos de preguntas sobre este tema. Leí muchos de ellos para encontrar la manera MÁS SEGURA de almacenar una contraseña, pero cada respuesta dada me da la sensación de que todavía podemos hacerlo mucho mejor. Y estoy planeando usar esto en PHP pero creo que se aplica a cualquier lenguaje de codificación.
No soy un experto en seguridad pero ¿no es solo un método no lo suficientemente seguro?
ENCRYPT
Si entendí correctamente La contraseña cifrada (con PHP) se puede descifrar a texto simple si conoce la cadena que se usó. La mayoría de las cuentas de alojamiento que he visto hackeado primero obtienen acceso a los archivos y luego buscan la contraseña de DB almacenada en config.php o algo así.
Incluso si utilizo una cadena grande y complicada para cifrar la contraseña, si el intruso va a create_account.php (o donde sea que se cree el usuario), encontrará la cadena allí y podrá descifrar la contraseña completa. Columna en unos minutos (¿verdad?)
HASHING
Lo bueno de hashing es que la contraseña no se puede devolver a texto sin formato, lo cual es genial pero ... Muchos métodos de hashing tienen vulnerabilidades y he estado leyendo algunos artículos que obtienen valores posibles para un hashing (un cadena de hash puede significar más de una cadena de texto sin formato). Leí un artículo que decía que algunas personas podían recuperar la contraseña del hash usando Amazon EC2 en segundos para contraseñas débiles y horas para contraseñas fuertes.
Incluso vi directorios de índice de hash donde los hackers y j * rks aleatorios almacenan grandes cantidades de valores de cadena de hash > por lo tanto, si ingresas el hash que obtuviste, puedes obtener una posible contraseña en solo un segundo. Esto sigue siendo una especie de ataque de diccionario, pero bastante efectivo.
Para el hash común como MD5, incluso vi un artículo en el que un pirata informático descubrió fácilmente que Google indiza de alguna manera los hashes MD5 debido a su uso (como en los nombres de archivo, gravatar.com y API similares, etc.), por lo que tuvo una Diccionario de HUUUGE indexado de hash que solo toma un segundo para asociarse a los valores.
Una vez se creyó que MD5 y SHA1 eran seguros, pero luego aparecieron las vulnerabilidades. ¿Qué pasa si el método de confianza utilizado ahora (leo el pez globo es el mejor, es correcto?) Obtiene algún tipo de vulnerabilidad en el futuro?
Y por último, sé que esto es ridículo, pero me siento incómodo con la posibilidad de que 2 contraseñas tengan el mismo resultado hash. Sé que las posibilidades de que alguien adivine el otro valor que tiene el mismo hash es muy baja, pero, ¡estamos en 2012! ¿No se suponía que tendríamos coches voladores y computadoras que podrían hacer que la película de Avatar en una hora ya? ? : P Ya debería haber algo mejor ...
SAL
Incluso si uso sal para dificultar la recuperación de la contraseña, si el pirata informático ve la cadena de sal fija (o donde se almacenó la sal aleatoria), la fuerza bruta con la nube no sería mucho más complicada. , ¿lo haría?
¿NO HAY ALGO MEJOR?
Como dije, estoy lejos de ser un experto en seguridad, pero ¿no hay alguna opción por ahí? He leído muchas preguntas sobre esto aquí en Desbordamiento de pila y el resultado de Google (que son la mayoría de las respuestas de desbordamiento de pila: D) y casi siempre dicen lo mismo.
Si el hash y el cifrado son las únicas opciones, ¿es una manera de mejorarlo? ¿Hay alguna forma de ocultar la contraseña de cifrado en el caso de que se acceda al archivo que crea los usuarios?
En todas esas respuestas nunca vi a alguien que sugiriera combinar métodos como:
sha1 (cripta [blowfish.salt], sal) ¿Es esta una mala idea por alguna razón? (Solo puedo pensar en consumir demasiado procesador en un sitio con miles de usuarios que se registran e inician sesión, pero puedo manejarlo en los sitios que planeo usar)
No estoy preguntando "por favor, codifíqueme esto", quiero saber cómo hacerlo "lo más imposible posible" (más difícil: P) para obtener las contraseñas en el caso de que el DB y el Código fuente se encontraran en el manos equivocadas
Tal vez entendí mal la forma en que funcionan estos métodos y quizás hay algo como una función PHP para hacer que una cadena sea indescifrable incluso con la contraseña, o tal vez me perdí algo. Todavía me resulta extraño que nadie haya sugerido una combinación de métodos.
Gracias de antemano y gracias de nuevo si todavía estás leyendo los pensamientos de mi mente preocupada