¿Las salidas de este software generador de cadenas aleatorias son seguras para usar como contraseñas seguras?

1

Hace más de un año, he creado un pequeño software basado en formularios.

Su propósito, como indica el título, es generación de cadenas aleatorias .

Tiene opciones para combinar numéricos, mayúsculas, mayúsculas y caracteres especiales dentro del conjunto de caracteres ASCII (94 en total). Pronto tendrá soporte para UTF-8 (y se marcará como opcional / experimental, porque algunos sitios web no permiten nada excepto ASCII para las contraseñas).

Utiliza la clase RNGCryptoServiceProvider y sus métodos ( GetBytes() y ToString() ) para producir una salida.

Si seleccionamos todas las opciones (ASCII completo), tenemos 94 caracteres. Especificamos que queremos que nuestra salida tenga 64 caracteres de longitud.

Nuestra fuerza en bits es: 94 ^ 64 o log (base 2, 94) * 64 = 419

EDITAR: Ejemplo: 4Ed(R{MQ_U9pQ#?9k'V2p1bpW+UrEBkebif9w'Qsp>n7i~PF,]DCdV18sqilN(ou

Pregunta 1: ¿Es seguro usar esta salida como una contraseña segura?

Pregunta 2: ¿Hay algo más que deba implementar para mejorar la seguridad?

Lenguaje de programación: C #

IDE: SharpDevelop 4.4

Framework: .NET 4.5

    
pregunta Miloš Veljanoski 30.05.2017 - 10:06
fuente

3 respuestas

1

La forma ingenua de hacer esto:

... {
    result.Append(chars[b % (chars.Length)]);
} 
tbOutput.Text = Convert.ToString(result);

producirá una contraseña con una distribución de caracteres no uniforme, lo que es una debilidad.

Una forma de generar resultados imparciales (sin probar, y no soy un programador de C #, por lo que parte de la sintaxis podría estar desactivada), tenga en cuenta que probablemente este no sea el método más eficiente para hacer esto:

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
System.Text.StringBuilder result = new System.Text.StringBuilder();

// assumption: chars.Length < ulong.MaxValue
ulong bound = ulong.MaxValue - (ulong.MaxValue % chars.Length);

while (result.Length < desiredPwLen) {
    // assumption: ulong is 64-bit
    ulong rndNum;
    do { 
        byte[] rndBytes = new byte[8]; // assumption: 1 byte is 8 bits, so 8 bytes is 64 bits
        rng.GetBytes(rndBytes);
        rndNum = BitConverter.ToUInt64(rndBytes, 0);
    } while (rndNum >= bound); // rndNum above bound is biased, so we discard them, and roll again

    result.Append(chars[rndNum % chars.Length]);
}
string password = result.ToString();

Responda a sus preguntas:

  
  1. ¿Es seguro usar esta salida como una contraseña segura?
  2.   

Probablemente sí, mientras que su método de codificación de contraseña tiene la debilidad que mencioné anteriormente, si la longitud de su contraseña es lo suficientemente larga, entonces habría compensado el sesgo.

  
  1. ¿Hay algo más que deba implementar para mejorar la seguridad?
  2.   

He proporcionado anteriormente una mejora que corrige el sesgo.

    
respondido por el Lie Ryan 30.05.2017 - 16:36
fuente
0

Desde el punto de vista de la seguridad, lo que usted describe se ve bien, siempre que solicite un carácter de un conjunto (dicho de otra manera, obtenga un int aleatorio en el rango 1-94 para el conjunto completo de tamaños del conjunto real de un subconjunto) .

Desde el punto de vista de la usabilidad, lo que describe no está lejos del generador de contraseñas del excelente Keypass . De hecho, proporcionan diferentes conjuntos de caracteres especiales:

  • puede incluir separadamente - , _ y espacio
  • los paréntesis tienen su propia clase ( (){}[]<> )
  • todos los demás caracteres especiales están en otra clase

Supongo que tuvieron que implementarlo porque algunas reglas de seguridad (mal diseñadas) lo requieren.

Como características avanzadas, también permiten:

  • cada carácter solo puede aparecer una vez en la cadena de contraseña
  • no permiten caracteres similares (0 y O, 1 y l)

Aquí nuevamente se tuvo que implementar para hacer frente a las estúpidas reglas de seguridad.

Depende de usted incluir o no esas reglas, depende principalmente del uso esperado.

También puede consultar otros generadores de contraseñas existentes para ver si otras restricciones podrían ser relevantes.

    
respondido por el Serge Ballesta 30.05.2017 - 11:24
fuente
0

Como sugirió Serge, si es "seguro" depende de lo que hagas con él. Recientemente me ha costado mucho tratar de garantizar que las contraseñas generadas funcionen cuando se pegan en archivos de configuración o incluso se fusionan en archivos .bat. Resulta que hay un lote de software mal escrito que no proporciona medios para escapar de forma segura y he visto problemas con comillas, caracteres de redirección de E / S y más.

Con respecto a las 'clases': estas reglas generalmente existen para alentar a los seres humanos a elegir mejores contraseñas (pero no he visto ninguna investigación seria sobre si realmente funcionan). Esto niega la posibilidad de utilizar un conjunto de caracteres "seguro" más pequeño (minúsculas + mayúsculas + dígitos) con una longitud más larga para lograr la misma entropía.

Sin ver su código, tengo algunas reservas sobre su estimación de la entropía. Parece que estás usando RNGCryptoServiceProvider.toString () en una cadena binaria pero el documentación revela poco acerca de cómo se realiza esta conversión. Si bien consideraría que cualquier cosa con más de 10 caracteres (y que requiera reglas, como clases) es demasiado difícil de recordar, hay contextos en los que hay una complejidad mínima requerida.     

respondido por el symcbean 30.05.2017 - 17:01
fuente

Lea otras preguntas en las etiquetas