Pregunta

¿Cuál es la mejor manera de manejar la administración de cuentas de usuario en un sistema, sin tener a sus empleados que tienen acceso a una base de datos, para tener acceso a las cuentas.

Ejemplos:

  1. Almacenar el nombre de usuario/contraseña en la base de datos.Esta es una mala idea porque cualquiera que tenga acceso a una base de datos puede ver el nombre de usuario y contraseña.Y, por lo tanto usarlo.

  2. Almacenar el nombre de usuario/contraseña hash.Este es un método mejor, pero la cuenta se puede acceder mediante la sustitución de los hash de contraseña en la base de datos con el hash de otra cuenta que usted sabe el auth info para.A continuación, después de que el acceso se concede a revertir de nuevo en la base de datos.

¿Cómo windows/*nix manejar esto?

¿Fue útil?

Solución

Este era un problema común en UNIX hace muchos años, y que fue resuelto por la separación de la identidad del usuario componentes de (nombre de usuario, UID, shell, nombre completo, etc.) a partir de la autenticación de los componentes (hash de contraseña, la contraseña hash sal).La identidad de los componentes puede ser globalmente legible (y en realidad debe ser, si Uidos que se asignan a los nombres de usuario), pero la autenticación de los componentes debe se mantuvo inaccesible para los usuarios.Para autenticar a un usuario, tiene un sistema fiable que aceptar un nombre de usuario y contraseña, y devolverá un simple resultado de la "autentica" o "no autenticado".Este sistema debe ser la única aplicación con acceso a la base de datos de autenticación, y debe esperar por una cantidad aleatoria de tiempo (tal vez entre 0,1 y 3 segundos) antes de responder para ayudar a evitar el momento de los ataques.

Otros consejos

Este es un método mejor, pero la cuenta se puede acceder mediante la sustitución de los hash de contraseña en la base de datos con el hash de otra cuenta que usted sabe el auth info para.

Realmente, no hay forma de evitar esto.Cualquier persona que como el acceso de escritura para el archivo de contraseña tiene el control completo de la computadora.

Me gustaría ir con 2 pero el uso de un poco de sal.Algunos pseudocódigo:

SetPassword(user, password)
    salt = RandomString()
    hash = Hashfunction(salt+password)
    StoreInDatabase(user, salt, hash)

CheckPassword(user, password)
    (salt, hash) = GetFromDatabase(user)
    if Hashfunction(salt+password) == hash
        return "Success"
    else
        return "Login Failed"

Es importante el uso de una conocida de una función hash (como MD5 o SHA-1), implementado en una biblioteca. No darse su propia cuenta o intentar aplicar es de un libro simplemente no vale la pena el riesgo de equivocarse.

@Brian R.Bondy:La razón por la que el uso de la sal es hacer que el diccionario attaks más difícil, el atacante no puede hash de un diccionario y probar en contra de todas las contraseñas, en su lugar, ella tiene que tomar la sal + el diccionario y hash, lo que hace que el almacenamiento de requierments expode.Si usted tiene un diccionario de las 1000 más commaon contraseñas y hash de ellos tiene algo así como 16 kB, pero si se añaden dos letras al azar que usted consigue 62*62*16 kB ≈ 62 Mb.

Otra cosa que usted podría utilizar algún tipo de Contraseñas de un solo uso He oído cosas buenas acerca de OTPW pero havent utilizado.

Jeff Atwood tiene algunos buenos puestos sobre la mezcla, si usted decide ir por ese camino:

Usted podría utilizar openID y ahorrar no confidencial de las contraseñas de usuario en absoluto.Quien dijo que es para los sitios web sólo?

  1. Una muy mala idea, de hecho.Si la base de datos se ve comprometida, todas las cuentas están en peligro.
  2. Buena manera de ir.Si el algoritmo de hash incluye el nombre de usuario, reemplazando el valor hash de la contraseña con otro no va a funcionar.

Unix tiendas de hash en un archivo de texto /etc/shadow, el cual sólo es accesible para los usuarios con privilegios.Las contraseñas se cifran con una sal.

Se puede almacenar en el sal para el hash de la contraseña en otra tabla, por supuesto, cada usuario tiene su propia sal.Entonces, usted puede limitar el acceso a la tabla.

El enfoque habitual es usar la opción dos, con el correo electrónico:

Almacenar el nombre de usuario, hash de contraseña y dirección de correo electrónico en la base de datos.

Los usuarios pueden introducir su contraseña o restablecer, en el último caso se generará una contraseña aleatoria, un nuevo hash es creado por el usuario y la contraseña se envía a él a través de correo electrónico.

Editar:Si la base de datos se ve comprometida, a continuación, sólo se puede garantizar nada sensato puede acceder a la información, no se puede garantizar la seguridad de su aplicación.

Hash del nombre de usuario y la contraseña juntos.De esa manera, si dos usuarios tienen la misma contraseña, los hashes todavía va a ser diferente.

Esto es un poco de un no problema para muchas aplicaciones debido a que la obtención de acceso a la base de datos es probablemente el objetivo más común de cualquier atacante.Así que si ya tienen acceso a la base de datos ¿por qué todavía quieren acceder a la aplicación ?:)

Si el "sistema" es un sitio web público RPX puede proporcionar un inicio de sesión de usuario/cuenta de servicios de la mayoría de los proveedores, como OpenId, Facebook, Google, etc.

Ahora, dada la manera de formular su pregunta supongo que el 'sistema' que estamos hablando es más probable que un interno de windows/linux enterprise app.Sin embargo;para aquellos con el google para iniciar sesión/usuario de la cuenta de proveedores (como yo lo hice antes de un vino a través de RPX), esto podría ser una buena opción :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top