Pregunta

Necesito generar algunas contraseñas, quiero evitar caracteres que puedan confundirse entre sí.¿Existe una lista definitiva de personajes que debo evitar?mi lista actual es

il10o8B3Evu![]{}

¿Hay otros pares de personajes que sean fáciles de confundir?para los caracteres especiales iba a limitarme a los que se encuentran debajo de las teclas numéricas, aunque sé que esto difiere según la nacionalidad de su teclado.

Como pregunta adicional, me gustaría que mis contraseñas fueran "similares a palabras". ¿Tiene algún algoritmo favorito para eso?

Gracias :)

¿Fue útil?

Solución

Aquí están los conjuntos de caracteres que Steve Gibson usa para su "Contraseña de papel perfecto" sistema.Son "caracteres para permitir" en lugar de "caracteres para evitar", pero parecen bastante razonables para lo que quieres:

Un conjunto estándar de 64 caracteres.

!#%+23456789:=?@ABCDEFGHJKLMNPRS
TUVWXYZabcdefghijkmnopqrstuvwxyz

Un conjunto más grande de 88 caracteres.

!"#$%&'()*+,-./23456789:;<=>?@ABCDEFGHJKLMNO
PRSTUVWXYZ[\]^_abcdefghijkmnopqrstuvwxyz{|}~

Para contraseñas pronunciables, no estoy familiarizado con los algoritmos, pero es posible que desee consultar APG y pwgen como punto de partida.

Otros consejos

Mi método preferido es obtener una lista de palabras de 3, 4 y 5 letras.Luego seleccione al menos 2 de ellas y coloque un número aleatorio de 2 dígitos o un símbolo especial (%&*@#$) entre cada palabra.Si lo desea, puede escribir en mayúscula hasta un carácter por palabra al azar.

Dependiendo de sus requisitos de seguridad, obtendrá contraseñas fáciles de recordar y comunicar, como:

  • escritorio%limon
  • papel y boy32hat

Ten en cuenta que ocasionalmente obtienes combinaciones de palabras interesantes o inapropiadas (te dejaré usar tu imaginación).Normalmente tengo un botón que permite generar una nueva contraseña si no me gusta la presentada.

Como regla general, utilice únicamente símbolos cuyo nombre la gente conozca comúnmente.En un teclado estándar de EE. UU. evitaría ~`'/\^

Supongo que esto respondió más a tu pregunta sobre el ciclista que a tu pregunta principal...

¡Buena suerte!

Leer Elegir contraseñas seguras.

Un dato interesante a partir de ahí:Para contraseñas más seguras, asegúrese de que aparezcan algunos números y caracteres especiales en el medio.Los programas de craqueo los comprueban al principio y terminan antes.

Para agregar a la respuesta de Jim, también puedes usar la lista de palabras y reemplazar aleatoriamente ciertos caracteres con símbolos (una @ para una A, un 0 (cero) para una O o un 5 para una S) y/o eliminar las vocales de las palabras. .

  • lmn%Escritorio
  • p@per&b0y32H@t

Todavía en su mayoría legible por humanos.

Como otra opción, puede utilizar una fuente monoespaciada/terminal como courier para imprimir las contraseñas.Los personajes similares deberían ser mucho más distinguibles de esa manera.

Hace varios años, para un cliente internacional, tuve que generar contraseñas aleatorias y seguras que luego mi cliente fusionaba en documentos y enviaba por correo postal a destinatarios en 40 países.Sin saber qué tipo de letra se iba a utilizar en los documentos, utilicé una lista de caracteres como el de Steve Gibson. 64 caracteres configurado para eliminar la confusión entre glifos similares.

Para que las contraseñas resultantes fueran pronunciables y, por lo tanto, más fáciles de recordar, emparejé consonantes y vocales, con algunos dígrafos de consonantes (sh, th, wh, etc.) agregados a la mezcla.

Para reducir las posibilidades de que se generen palabras inapropiadas u ofensivas (en inglés o en los idiomas de los destinatarios), limité las series de caracteres alfabéticos consecutivos a dos, con números o caracteres de puntuación entre ellos:

Es4tU$sA6
wH@cY8Go2

Al revisar mi método ahora, me doy cuenta de que había margen de mejora en el algoritmo de inadecuación.Usando solo las reglas anteriores, algunas palabras ofensivas son posibles ahora que algunos números y signos de puntuación se sustituyen por letras.

Para contraseñas legibles por humanos, recientemente utilicé un script PHP muy similar al siguiente.Funcionó bien.Por supuesto, las contraseñas no serán increíblemente seguras (ya que son propensas a ataques de diccionario), pero para contraseñas memorizables, o al menos legibles, funciona bien.Sin embargo, esta función no debe usarse tal como está, es más una ilustración que cualquier otra cosa.

function generatePassword($syllables = 2, $use_prefix = true)
{

    // Define function unless it is already exists
    if (!function_exists('arr'))
    {
        // This function returns random array element
        function arr(&$arr)
        {
            return $arr[rand(0, sizeof($arr)-1)];
        }
    }

    // Random prefixes
    $prefix = array('aero', 'anti', 'auto', 'bi', 'bio',
                    'cine', 'deca', 'demo', 'dyna', 'eco',
                    'ergo', 'geo', 'gyno', 'hypo', 'kilo',
                    'mega', 'tera', 'mini', 'nano', 'duo',
                    'an', 'arch', 'auto', 'be', 'co',
                    'counter', 'de', 'dis', 'ex', 'fore',
                    'in', 'infra', 'inter', 'mal', 
                    'mis', 'neo', 'non', 'out', 'pan',
                    'post', 'pre', 'pseudo', 'semi',
                    'super', 'trans', 'twi', 'vice');

    // Random suffixes
    $suffix = array('dom', 'ity', 'ment', 'sion', 'ness',
                    'ence', 'er', 'ist', 'tion', 'or',
                    'ance', 'ive', 'en', 'ic', 'al',
                    'able', 'y', 'ous', 'ful', 'less',
                    'ise', 'ize', 'ate', 'ify', 'fy', 'ly'); 

    // Vowel sounds 
    $vowels = array('a', 'o', 'e', 'i', 'y', 'u', 'ou', 'oo', 'ae', 'ea', 'ie'); 

    // Consonants 
    $consonants = array('w', 'r', 't', 'p', 's', 'd', 'f', 'g', 'h', 'j', 
                        'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'qu');

    $password = $use_prefix?arr($prefix):'';
    $password_suffix = arr($suffix);

    for($i=0; $i<$syllables; $i++)
    {
        // selecting random consonant
        $doubles = array('n', 'm', 't', 's');
        $c = arr($consonants);
        if (in_array($c, $doubles)&&($i!=0)) { // maybe double it
            if (rand(0, 2) == 1) // 33% probability
                $c .= $c;
        }
        $password .= $c;
        //

        // selecting random vowel
        $password .= arr($vowels);

        if ($i == $syllables - 1) // if suffix begin with vovel
            if (in_array($password_suffix[0], $vowels)) // add one more consonant 
                $password .= arr($consonants);

    }

    // selecting random suffix
    $password .= $password_suffix;

    return $password;
}

En mi escuela de posgrado (ingeniería eléctrica, técnico), todas las cuentas de computadora se inicializaron con contraseñas que, supongo, fueron generadas por una utilidad estándar de Linux.Consistían en tres sílabas aleatorias, con tres letras minúsculas en cada sílaba.El resultado fue razonablemente seguro (del orden de miles de millones de combinaciones posibles) pero tan pronunciable que todavía uso algunas de esas contraseñas más de una década después.El ejemplo de James es una excelente demostración de esto.

Un comentario sobre contraseñas en general, de un profesional de seguridad de redes:son terribles por varias razones, entre ellas:

  • Generalmente se rompe fácilmente, ya sea mediante ingeniería social o con software de ataque, especialmente si sabes cualquier cosa sobre tu objetivo.

    Ejemplo 1: Recientemente necesité revisar un documento técnico protegido con contraseña.Al mirar la fecha, supe quién era nuestro redactor técnico residente en ese momento, escribí la primera palabra que me vino a la mente e inmediatamente desbloqueé el documento.

    Ejemplo 2: Los programas estándar para descifrar contraseñas permiten al descifrador especificar un conjunto de reglas que operan en un diccionario proporcionado por el usuario.Es trivial reemplazar ciertas letras con $ymb01$, o traducirlas a 1337, etc.

  • Las contraseñas "seguras" no lo son.Dada la gran cantidad de contraseñas que la mayoría de las personas necesitan recordar, la forma más común de "recordar" una contraseña "segura" como "a4$N!8_q" es escribirla en una hoja de papel (o, peor aún, guardarla en un archivo de texto).'Nuff dijo.

Si realmente necesitas seguro autenticación, multifactor (o dos factores) es el mecanismo aceptado por la industria.Los "dos factores" suelen ser algo que usted tener (como una tarjeta de acceso) y algo que usted saber que lo habilita (como un PIN).Ninguno funciona sin el otro: necesitas ambos.

Por otro lado, considera el nivel de seguridad que realmente necesitas.¿Qué estás protegiendo?¿Qué tanto desean los "malos" conseguirlo y cuáles son las consecuencias si lo consiguen?Lo más probable es que "es@secreto!" es más que lo suficientemente bueno.:-)

No me encanta el enfoque de lista de palabras.Por ejemplo, en /usr/share/dict/words en OSX, hay 5110 palabras de 4 caracteres.Usar dos de ellos con un carácter separador produce ~600 millones de combinaciones.Pero si usara el conjunto de caracteres directamente con un potente generador de números aleatorios, tendría 88^9 contraseñas posibles, 3.16e+17 combinaciones.

De cualquier manera, el ataque probable contra este sistema será contra el generador de números aleatorios, así que asegúrese de utilizar uno criptográficamente sólido.Si utiliza la función rand estándar de PHP, será atacado registrando y restableciendo miles de contraseñas para muestrear el estado del RNG y luego predecir el estado del RNG restante, lo que reducirá la cantidad de posibles contraseñas que un atacante debe probar.

Un enfoque inicial podría ser generar sílabas en inglés en su mayoría válidas, mezclarlas y luego realizar una conversión texto->l33t.Se ha trabajado en gramáticas generacionales del lenguaje natural, por lo que una de ellas podría ayudar.

P.ej.ah ul ing son todas sílabas válidas o cercanas a ellas...mézclalos -> Ingulah...l33t it -> 1ngu4h.¿Es el mejor que hay?No.Pero al menos es semipronunciable (si habla l33t) y es más seguro computacionalmente.

Si está interesado en generar contraseñas pronunciables, hay un puerto C# en:http://www.hoogervorst.ca/arthur/?attachment_id=1708

Dentro del código, encontrará enlaces útiles para obtener más información.http://www.multicians.org/thvv/gpw.html

Buena suerte.Jaime

function random_readable_pwd($length=12){
    // special characters
    $sym="!\"§$%&/()={[]}\,.-_:;@>|";

    // read words from text file to array
    $filename="special.txt";
    if (!file_exists($filename)) { die('File "'.$filename.'" is not exists!'); }
    $lines = file($filename);
    foreach ($lines as $line_num => $line) {
        $line=substr($line, 0, -2);
        $words[].=$line;
    }

    // Add words while password is smaller than the given length
    $pwd = '';
    $ran_date=date("s");
    while (strlen($pwd) < $length){
        $r = mt_rand(0, count($words)-1);
        // randomly upercare word but not all in one time
        if ($ran_date % 3 == 0) $words[$r]=ucwords($words[$r]);
        $pwd .= $words[$r];
        //randomly add symbol
        if ($ran_date % 2 == 0) $pwd .= $sym{mt_rand(0,strlen($sym))};
        $ran_date++;
    }

    // append a number at the end if length > 2 and
    // reduce the password size to $length
    $num = mt_rand(1, 99);
    if ($length > 2){
        $pwd = substr($pwd,0,$length-strlen($num)).$num;
    } else { 
        $pwd = substr($pwd, 0, $length);
    }

    return $pwd;

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