passwords - validar - poner asteriscos contraseña html
Reemplazar la contraseña de texto sin formato para la aplicación (14)
más contraseñas podrían coincidir con el hash y un ataque de diccionario / hash sería más rápido.
Si y no. Use un algoritmo hash moderno, como una variante SHA, y ese argumento se obtiene muy, muy semana. ¿De verdad necesitas estar preocupado si ese ataque de fuerza bruta va a tomar solo 352 años en vez de 467 años? (Una broma anecdótica allí). El valor que se obtendrá (no tener la contraseña almacenada en texto sin formato en el sistema) supera con creces la preocupación de su colega.
Actualmente estamos almacenando contraseñas de texto sin formato para una aplicación web que tenemos.
Sigo abogando por pasar a un hash de contraseñas, pero otro desarrollador dijo que esto sería menos seguro: más contraseñas podrían coincidir con el hash y un ataque de diccionario / hash sería más rápido.
¿Hay algo de verdad en este argumento?
Absolutamente ninguno. Pero no importa. He publicado una respuesta similar antes:
Es desafortunado, pero las personas, incluso los programadores, son demasiado emocionales para ser fácilmente influidos por la discusión. Una vez que ha invertido en su puesto (y, si publicas aquí, lo está haciendo), no es probable que lo convenzas solo con los hechos. Lo que debes hacer es cambiar la carga de la prueba. Debes sacarlo en busca de datos que él espera que te convenzan y, al hacerlo, aprender la verdad. Desafortunadamente, él tiene el beneficio del status quo, por lo que tienes un camino difícil allí.
De Wikipedia
Algunos sistemas informáticos almacenan contraseñas de usuario, contra las cuales se pueden comparar los intentos de inicio de sesión del usuario, como texto claro. Si un atacante obtiene acceso a un almacén interno de contraseñas, todas las contraseñas se verán comprometidas. Si algunos usuarios emplean la misma contraseña para cuentas en diferentes sistemas, también se verán comprometidos.
Los sistemas más seguros almacenan cada contraseña en una forma protegida criptográficamente, por lo que el acceso a la contraseña real seguirá siendo difícil para un snooper que obtiene acceso interno al sistema, mientras que la validación de los intentos de acceso de los usuarios sigue siendo posible.
Una aproximación común almacena solo una forma "hash" de la contraseña de texto simple. Cuando un usuario escribe una contraseña en dicho sistema, el software de manejo de contraseñas ejecuta un algoritmo hash criptográfico y si el valor hash generado a partir de la entrada del usuario coincide con el hash almacenado en la base de datos de contraseñas, el usuario tiene acceso permitido. El valor hash se crea aplicando una función hash criptográfica a una cadena que consiste en la contraseña enviada y, generalmente, otro valor conocido como sal. La sal evita que los atacantes construyan una lista de valores hash para contraseñas comunes. MD5 y SHA1 se utilizan con frecuencia funciones de cifrado hash.
Hay mucho más que puedes leer sobre el tema en esa página. En mi opinión, y en todo lo que he leído y trabajado, el hashing es un mejor escenario a menos que uses un algoritmo muy pequeño (<256 bit).
Depende de lo que defiendas. Si se trata de un atacante que tira de su base de datos (o engaña a su aplicación para que muestre la base de datos), entonces las contraseñas de texto plano son inútiles. Hay muchos ataques que se basan en convencer a la aplicación de que libere sus datos privados: inyección de SQL, secuestro de sesión, etc. A menudo es mejor no mantener la información en absoluto, sino mantener la versión hash tan mal que los chicos no pueden usarla fácilmente. .
Como sugiere su compañero de trabajo, esto puede ser trivialmente derrotado ejecutando el mismo algoritmo hash contra un diccionario y usando tablas de arcoíris para extraer la información. La solución habitual es utilizar una sal secreta más información adicional del usuario para que los resultados hash sean únicos, algo así como:
String hashedPass=CryptUtils.MD5("alsdl;ksahglhkjfsdkjhkjhkfsdlsdf" + user.getCreateDate().toString() + user.getPassword);
Siempre que su sal sea secreta, o su atacante no sepa la fecha precisa de creación del registro del usuario, un ataque de diccionario fallará, incluso en el caso de que puedan desplegar el campo de contraseña.
En teoría, sí. Las contraseñas pueden ser más largas (más información) que un hash, por lo que existe la posibilidad de colisiones hash. Sin embargo, la mayoría de los ataques se basan en diccionarios, y la probabilidad de colisiones es infinitamente más pequeña que una coincidencia directa exitosa.
Hay un viejo refrán sobre programadores que pretenden ser criptógrafos :)
Jeff Atwood tiene una buena publicación sobre el tema: Probablemente está almacenando contraseñas incorrectamente
Para responder más extensamente, estoy de acuerdo con todo lo anterior, el hash hace que sea más fácil en teoría obtener la contraseña del usuario ya que varias contraseñas coinciden con el mismo hash. Sin embargo, es mucho menos probable que esto suceda que alguien que tenga acceso a su base de datos.
Hay verdad en que si has algo, sí, habrá colisiones, por lo que sería posible que dos contraseñas diferentes desbloqueen la misma cuenta.
Sin embargo, desde un punto de vista práctico, ese es un argumento pobre: una buena función de hashing (md5 o sha1 estaría bien) puede garantizar que para todas las cadenas significativas, especialmente las cortas, no habrá colisiones. Incluso si lo hubiera, tener dos contraseñas para una cuenta no es un gran problema: si alguien está en posición de adivinar las contraseñas de forma aleatoria lo suficientemente rápido como para poder ingresar, usted tiene problemas mayores.
Yo argumentaría que almacenar las contraseñas en texto plano representa un riesgo de seguridad mucho mayor que las colisiones hash en la coincidencia de contraseñas.
Me encontré con este mismo problema en mi lugar de trabajo. Lo que hice para convencerlo de que el hashing era más seguro fue escribir una inyección SQL que devolvió la lista de usuarios y contraseñas de la sección pública de nuestro sitio. Se escalo de inmediato como un gran problema de seguridad :)
Para evitar ataques de diccionario / hash, asegúrese de realizar un hash contra un token que es exclusivo de cada usuario y estático (nombre de usuario / fecha de inicio / userguid funciona bien)
Nada es menos seguro que almacenar contraseñas de texto sin formato. Si está usando un algoritmo hash decente (al menos SHA-256, pero incluso SHA-1 es mejor que nada) entonces sí, las colisiones son posibles, pero no importa porque dado un hash, es imposible * calcular qué cadenas de hash a él. Si hash el nombre de usuario CON la contraseña, entonces esa posibilidad también se va por la ventana.
* - técnicamente no imposible, pero "computacionalmente inviable"
Si el nombre de usuario es "graeme" y la contraseña es "", cree una cadena "graeme--1234" donde 1234 es un número aleatorio, luego hash it y almacene " hashoutput 1234" en la base de datos. Cuando se trata de validar una contraseña, tome el nombre de usuario, la contraseña suministrada y el número desde el final del valor almacenado (el hash tiene una longitud fija para que siempre pueda hacer esto) y cópielos juntos, y compárelos con el hash parte del valor almacenado.
No entiendo cómo las otras contraseñas de tus otros desarrolladores podrían coincidir con el hash ''.
Existe el argumento de que un "ataque de hash sería más rápido", pero solo si no se saltean las contraseñas ya que son hash. Normalmente, las funciones hash le permiten proporcionar una sal que hace que el uso de la tabla hash conocida sea una pérdida de tiempo.
Personalmente, yo diría ''no''. Basado en lo anterior, así como en el hecho de que si de alguna manera obtiene una exposición de texto claro, un valor de hashed salado es de poco valor para alguien que intenta ingresar. Hashing también proporciona el beneficio de hacer que todas las contraseñas ''se vean'' mismo largo.
es decir, si el hash de cualquier cadena siempre da como resultado un hash de 20 caracteres, entonces si solo tiene que ver el hash, no puede decir si la contraseña original tenía ocho caracteres o dieciséis, por ejemplo.
No soy un experto en seguridad pero tengo la sensación de que si el texto plano fuera más seguro, no existiría el hashing en primer lugar.
Espero que me perdones por tapar una solución que escribí sobre esto, usando el lado del cliente JavaScript para descifrar la contraseña antes de que se transmita: http://blog.asgeirnilsen.com/2005/11/password-authentication-without.html
No hay absolutamente ninguna excusa para guardar contraseñas de texto sin formato en la aplicación web. Utilice un algoritmo hash estándar (SHA-1, no MD5!) Con un valor de sal, de modo que los ataques de arco iris sean imposibles.
Si no guarda su contraseña, sospecha que se trata de ataques de la tabla Rainbow (diccionarios precompilados que tienen entradas válidas para un hash determinado)
El otro desarrollador debería dejar de hablar sobre seguridad si está almacenando contraseñas en texto plano y comienza a leer sobre seguridad.
Las colisiones son posibles, pero no suelen ser un gran problema para las aplicaciones de contraseñas (principalmente son un problema en áreas donde los hashes se utilizan como una forma de verificar la integridad de los archivos).
Entonces: Saca tus contraseñas (agregando el Salt al lado derecho de la contraseña *) y usa un buen algoritmo hash como SHA-1 o preferiblemente SHA-256 o SHA-512.
PD: Un poco más de detalles sobre Hashes aquí .
* Estoy un poco inseguro de si la sal debería o no al principio o al final de la cadena. El problema es que si tiene una colisión (dos entradas con el mismo hash), agregar Sal al lado "incorrecto" no cambiará el hash resultante. De ninguna manera, no tendrás grandes problemas con Rainbow Tables, solo con colisiones