¿Este uso de PBKDF2 para generar contraseñas es seguro?

2

Leyendo Ingeniería de seguridad por Ross Anderson, chapter 2.4.7.1 Password Manglers tuvo una idea que finalmente parece resolver el problema que tengo con el actual 'Necesito para recordar una contraseña * fuerte para demasiadas soluciones de sistemas.

* ) mis contraseñas se generan aleatoriamente, con un tamaño que depende del nivel de importancia del servicio utilizado, con un mínimo de 8 caracteres y un máximo típico de aproximadamente 16 caracteres.


Un breve desglose de lo que no me gusta de las soluciones existentes:

  • escríbalos: no es seguro, no siempre se puede acceder a la lista;
  • guárdelos en un archivo cifrado: no siempre accesible;
  • use un software dedicado: no siempre accesible.


Así que, en resumen, estaba buscando una solución que es:

  • siempre disponible cuando está conectado a internet;
  • seguro (nadie puede robar o trabajar mis contraseñas).


Por lo tanto, mi pregunta es:
¿Es seguro usar PBKDF2 para generar una contraseña, basado en mi contraseña maestra (12 caracteres ASCII imprimibles generados al azar) y usando el nombre de dominio del sitio web (stackexchange.com) como un "salt"?

<?php
$password = $_POST['password'];
$salt = $_POST['publicIdentifier'];

function passKey($password, $salt) {
    $iterationCount = pow(2, 18); // 262.144 iterations
    $outputLength = 20; // because this should be 'secure enough'?

    // Step 1: get the derived key
    $generated = hash_pbkdf2('sha256', $password, $salt, $iterationCount, $outputLength, true); // returns binary output

    // Step 2: encode as Base91
    $generated = base91_encode($generated); // because we want 'special characters' in our password string (websites often require this)

    // Step 3: return the password, sliced down to required length
    return substr($generated, 0, $outputLength);
}
echo 'generated password: '.passKey($password, $salt);

¿Dado que la solución se alojaría en mi propio servidor web de confianza y solo sería accesible a través de SSL / TLS?


Si el atacante tiene acceso al código utilizado (publicado arriba), el 'publicIdentifier' y posiblemente una lista de las contraseñas generadas, ¿ protegería el esquema anterior contra el atacante al descubrir la contraseña maestra?

Me preocupa que el uso de una cadena corta , no generada aleatoriamente como una sal pueda comprometer la fortaleza de PBKDF2?

    
pregunta Monika 25.02.2016 - 14:57
fuente

2 respuestas

5

Este tipo de solución ha sido propuesta e implementada muchas veces. Funciona un poco, pero tiene algunos inconvenientes:

  • Si dos personas usan el mismo mecanismo para el mismo sitio de destino, entonces sus contraseñas usan el mismo 'sal' (el nombre del servidor), lo cual no es lo ideal. Conceptualmente, usted desea contraseñas por sitio para que la seguridad deficiente en un sitio no afecte su seguridad en otros sitios, por lo que de alguna manera asume que los atacantes recuperarán algunas de sus contraseñas. Si 10 usuarios utilizan su sistema en el mismo sitio y ese sitio se piratea, y el atacante obtiene las 10 contraseñas, podrá realizar un ataque paralelo a las 10 contraseñas maestras porque las 10 instancias de PBKDF2 usarán el mismo salt .

    En gran medida, este problema se puede solucionar utilizando como sal la concatenación del nombre del sitio de destino y su nombre (por ejemplo, su dirección de correo electrónico, que es única en todo el mundo). Tenga en cuenta que la sal no necesita ser secreta o aleatoria; Lo que necesita es ser único .

  • Solo obtiene una contraseña para un sitio determinado. Si el sitio desea imponer un cambio de contraseña y la nueva contraseña debe ser diferente de la anterior, entonces el sistema deja de ser aplicable.

  • Muchos sitios intentan imponer "reglas de contraseña" (longitud mínima, longitud máxima, presencia o ausencia de algunos tipos de caracteres ...). La mayoría de estas reglas son remanentes de rituales tradicionales con muy poca justificación científica, pero aún existen. El problema es que todas estas reglas son contradictorias: no hay un método de generación que produzca contraseñas que cumplan con todos los conjuntos de reglas que emplean los distintos sitios.

La conclusión es que, si bien un método de generación de contraseñas basado en hash funciona, tendrá que manejar excepciones .

Si tiene un servidor web de confianza accesible a través de SSL / TLS, ¿quizás podría simplemente almacenar sus contraseñas allí? Posiblemente con algún cifrado local, relativo a la contraseña maestra que escribe y envía a su servidor web.

    
respondido por el Tom Leek 25.02.2016 - 15:15
fuente
0

Si puede acceder a su sitio web especializado para obtener sus contraseñas, ¿por qué no puede acceder a un software web especializado para obtenerlas? LastPass, por ejemplo, ofrece recuperación en línea.

También podría llevar una versión portátil de KeePass (y otros administradores de contraseñas locales) en una unidad de disco con su base de datos.

O, la mayoría de los administradores de contraseñas en estos días tienen una aplicación para teléfonos inteligentes, por lo que puede recuperar fácilmente las contraseñas desde allí para escribir, suponiendo que tiene un teléfono inteligente y que lo lleva a la mayoría de los lugares.

En otras palabras: hecho bien, y con un poco de planificación, probablemente haya muy pocas situaciones en las que no pueda acceder a su administrador de contraseñas cuando lo necesite.

    
respondido por el Ben 25.02.2016 - 16:46
fuente

Lea otras preguntas en las etiquetas