Seguridad de la contraseña en las bases de datos: ¿sigue siendo la mejor práctica hoy en día? [duplicar]

47

Hay un montón de excelentes publicaciones sobre seguridad de contraseñas en bases de datos de desbordamiento de pila y en otros sitios y, como soy completamente nuevo en esto, pasé algunas horas intentando aprender más sobre esto en los últimos días. Sin embargo, hay tantas sugerencias y mejores prácticas que me confundí ...

Además, todavía hay muchas publicaciones más antiguas de 2007-2010, etc. Como he visto la rapidez con que cambian las cosas, no estoy seguro de que esto todavía sea común para usarlo como sugieren. Entonces, quería resumir lo que encontré en las publicaciones y luego preguntar si este método que encontré fue una buena práctica ...

Entonces, esto no es una guía, sino un resumen, sé que es muy básico y si hay errores, ¡corríjame!

  1. Solo para mencionar: nunca debe almacenar contraseñas de texto simple :)
  2. Tienes contraseñas hash "unidireccionales" para que nadie pueda ver el texto sin formato. Cuando el usuario ingresa la contraseña, la hash de la misma manera y la comparas con el paso de hash en la base de datos.
  3. Además del hash de una contraseña, debes agregarla. Usted agrega el salt a la cadena de contraseña simple y hash a la nueva cadena. Si la contraseña simple es débil, agregar la sal la hace más larga y fuerte.
  4. Además, la sal debería ser aleatoria (he leído que el término "sal" significa que es aleatorio de todos modos, de lo contrario, ¿se llamaba "clave"?). Esto es para evitar ataques de la tabla arco iris, porque el atacante tendría que crear una tabla para cada sal, lo que es mucho más costoso en términos de tiempo, etc. Además, si dos usuarios tienen la misma contraseña, no la reconocerá si usa sales al azar.
  5. ¡La sal no es un secreto! Se está almacenando en la base de datos junto a la contraseña de hash. Sin embargo, puede que no sea la mejor idea usar una marca de tiempo, la dirección de correo electrónico del usuario o cualquier otra cosa conectada al usuario como un sal aleatorio. Como una razón es por ejemplo mencionó que los usuarios tienden a usar las mismas contraseñas en múltiples sitios / servicios. Por lo tanto, la sal debe ser una cadena aleatoria, la mejor lectura sería de 64 bits.
  6. El siguiente paso es agregar una iteración al proceso de hashing (1000 o más bucles), para que el salt se agregue a la contraseña y luego se repitan una y otra vez, lo que significa que solo una fracción de segundo para el usuario espere al iniciar sesión, pero se resume si tiene aproximadamente 10.000 entradas en su base de datos.
  7. Podría ser un pequeño beneficio, si agrega una clave de sitio, almacenada, por ejemplo. como una var global además de la sal. Sin embargo, siempre debe suponer que los atacantes también tienen acceso a su sistema de archivos.
  8. Algoritmos de hash: he comprobado que ya no es seguro usar MD5, SHA1 y otros métodos débiles ...

Entonces, hay diferentes opiniones sobre si usar SHA256, SHA512? ¿Deberías usar hash_hmac? Algunos dicen que sí: ( enlace ) algunos dicen usar bibliotecas es la única manera segura ... y luego una o dos veces en una publicación que he leído para no usar bibliotecas como bcrypt o bubble fish ??

¿Es realmente necesario usar una biblioteca o es, por ejemplo, un método como este es suficiente:

function hash_password($password, $nonce) {

  for ($i = 0; $i < 5000; $i++) {
    $hashed_pass = hash_hmac('sha512', $hashed_pass . $nonce . $password, $site_key);
    }
  return $hashed_pass;
}

Mucha gente dice que no inventes tu propio algo, así que estoy un poco asustado solo por usar cualquier cosa inventada por mí mismo.

Puedo imaginar que es difícil de predecir, pero ¿por cuánto tiempo se puede considerar que un método usado hoy en día es lo suficientemente seguro?

ACTUALIZACIÓN: Gracias por todos sus comentarios excelentes. Falta un punto principal, como veo y muchos de ustedes dijeron: seguridad de contraseña, lo que significa que una contraseña segura es la básica. Creo que recibí el mensaje, gracias de nuevo! :)

ACTUALIZACIÓN 2: para completar, he encontrado el siguiente código en enlace que utilizo para generar una sal aleatoria:

function rand_string( $length ) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!§$%&/().-:;_#+*[]{}="; 

    $size = strlen( $chars );
    for( $i = 0; $i < $length; $i++ ) {
        $str .= $chars[ rand( 0, $size - 1 ) ];
    }

    return $str;
}

$random_salt= rand_string(20);
    
pregunta Chris 29.02.2012 - 10:25
fuente

5 respuestas

2

Información general:

Buena pregunta, pero todo lo que puedo decir es que depende totalmente del uso. Si lo usa solo para un sitio web pequeño, existe una gran posibilidad de que solo los "chiquillos de guión" lo visiten, en ese caso, un simple SHA1 con sal también es suficiente hoy en día. En este caso, 5-8-10 años o incluso más es totalmente bueno, los niños con guión realmente no entrarán en él si ven que no pueden hacerlo fácilmente. Si su sitio será atacado por alguna razón: sitio monetario, etc., entonces debería usar las funciones disponibles más recientes. En este caso, incluso me "arriesgo" a utilizar una función no oficial pero ya portada. En este momento hay una competencia de SHA3, para websties que tendrán mucho dinero, usaría uno de los 5 competidores de estos.

Los puntos que digo son importantes:

1. usa un sal aleatorio, quizás incluso 20 caracteres. Es mucho más difícil romper las contraseñas, e incluso si son rompibles, toma mucho tiempo para valer.
2. utilice SHA-1, SHA-2 o WHIRLPOOL. Con buena sal, MD5 también está bien, pero aún así lo sugiero.
3. puede usar una gran criptografía si las contraseñas de los usuarios son triviales. Debe asegurarse de que usen contraseñas largas que no sean de diccionario, con mayúsculas, letras minúsculas, números y símbolos, de lo contrario se puede romper fácilmente por la fuerza bruta. Podría considerar que podrían verse obligados a cambiar la contraseña cada año o algo así.

Al código:

El bucle muchas veces puede ser útil, pero no creo que se requiera 5000. 3 para la seguridad normal es bueno, o 100, tal vez 1000 podrían funcionar, pero creo que 5000 es demasiado. SHA-256 es bueno, pero podrías usar un algoritmo desarrollado específicamente para eso, consulta los comentarios.

    
respondido por el axiomer 29.02.2012 - 10:35
fuente
10

Olvidaste solo una pequeña cosa:

Fuerza de la contraseña.

Solo 2 palabras que sobreponderan todo tu brillante tema.

De hecho, hay cientos de temas en Stackoverflow que te dicen que uses este o ese algoritmo de hash y sales aleatorias.
Y solo muy pocos explican que con una contraseña débil toda la protección de la lista de ocho elementos, todos los hashes hmac-chmak-bumblemak extra seguros con 2048 bytes de sal largos se romperán en cuestión de segundos.

En cuanto a los usuarios pobres que no pueden recordar las contraseñas de $#%H4df84a$%#R , solo haga que no usen una contraseña, sino una frase de contraseña .

Is it a good day today, Winkie? Utiliza diferentes letras de caso, así como contraseñas de complejidad recomendada, pero mucho más fáciles de recordar.

Por supuesto, la frase no debería ser tan común como las contraseñas comunes como "Joe" o "123".
"Buenos días", "¡Oh Dios mío! ¡Mataron a Kenny!" las frases deben ser evitadas.
Pero al agregar algo de personalidad, estaría bien:
Oh My God! They moved Cthulhu! parece suficiente

Otra cosa que mencionar es una comunicación segura entre el servidor y el navegador
Sin ella, una contraseña simple se puede "rastrear" fácilmente en cualquiera de los enrutadores involucrados en la comunicación.

SSH o alguna implementación de autorización Digest no es menos esencial.

    
respondido por el Your Common Sense 29.02.2012 - 11:00
fuente
5

Una función hash de propósito general (MD5, SHA1, SHA256) con un buen hash podría ser lo suficientemente segura para la mayoría de los sitios web más pequeños, dada la potencia informática actual. Sin embargo, la ley de Moore asegurará que incluso las buenas contraseñas estarán expuestas a ataques de fuerza bruta en un futuro cercano. El problema es que las funciones hash se pueden calcular muy rápidamente. La mejor solución es usar bcrypt o PBKDF2 con un alto número de iteraciones. Bcrypt vs PBKDF2 se trató en enlace .

Algunas personas pueden pensar que esto es una exageración para la mayoría de los sitios, pero recuerde que las contraseñas se reutilizan todo el tiempo y que el almacenamiento de contraseñas suele ser algo que no cambiará hasta que haya un problema.

Recomendaciones:

  1. Utilice bcrypt o PBKDF2. NO USE candidatos SHA3. Es posible que contengan agujeros de seguridad que aún no se hayan descubierto.
  2. Use una sal aleatoria para protegerse contra los ataques de la mesa del arco iris.
  3. Forzar a los usuarios a seleccionar una frase de contraseña.

Más información

    
respondido por el tony 29.02.2012 - 18:32
fuente
2

La función hash_hmac() sería una buena opción, incluso puede superar los problemas de un algoritmo hash más débil. El único problema es que es también rápido. Eso significa que con suficiente cpu-power (nube), la creación de diferentes tablas de arco iris se hace posible, esa es la razón para la iteración. Si necesita esta alta seguridad, puede medir el tiempo que necesitan sus iteraciones y luego calcular el número de iteraciones necesarias para un tiempo determinado.

Editar:

La iteración puede resolver este problema, se debe hacer de manera que se pueda aumentar el número de iteraciones más adelante, sin invalidar los hashes existentes. Esto es necesario para adaptarse al nuevo hardware futuro, pero requiere almacenar los parámetros de hash junto con el hash.

El algoritmo hash bcrypt fue diseñado para satisfacer estas demandas, escribí un pequeño ejemplo de cómo utilizar bcrypt con PHP 5.3 , traté de comentarlo, para que uno pueda entender lo que está pasando.

    
respondido por el martinstoeckli 29.02.2012 - 11:30
fuente
-1

Primero que nada, no estás inventando un algoritmo propio. Está utilizando uno existente (sha512).

En segundo lugar, haces un bucle 5000 veces, eso no te hará ningún bien. Solo un par de veces será suficiente.

En tercer lugar, si estás almacenando una contraseña con sha512, y agregas una buena semilla, es realmente muy difícil recuperar la contraseña. Y a menos que esté con el FBI o algo así, debería considerarse lo suficientemente seguro, ya que llevará años descifrar 1 contraseña, y mucho menos su base de datos de usuario completa.     

respondido por el Topener 29.02.2012 - 10:31
fuente

Lea otras preguntas en las etiquetas