2008-09-11 18 views
21

Necesito generar algunas contraseñas, quiero evitar los caracteres que pueden confundirse entre sí. ¿Hay una lista definitiva de personajes que debo evitar? mi lista actual esCaracteres a evitar en las contraseñas generadas automáticamente

il10o8B3Evu! [] {}

¿Hay otros pares de caracteres que son fáciles de confundir? para los personajes especiales, me iba a limitar a los que están debajo de las teclas numéricas, aunque sé que esto varía según la nacionalidad de los teclados.

Como pregunta de piloto, me gustaría que mis contraseñas sean 'similares a las palabras' ¿tiene un algoritmo favorito para eso?

Gracias :)

+4

Great post. "il10o8B3Evu! [] {}" también! :-) –

+0

Quiere que la contraseña sea como una palabra y obtuvo 18 votos. La gente que obtiene el concepto de seguridad es hacer que una contraseña sea difícil de adivinar. – Paparazzi

+0

FWIW, termino pronunciando todas mis contraseñas, sin importar cuán poco faciles comiencen. Acaba de generar 'PJLUB7Cy' -" PJ "(como lo que te pones en la cama)," LUB "(lubro mi kitteh)," 7 "," suspiro ". Si te haces escribirlos una y otra vez, se pegan. – Amanda

Respuesta

34

Estos son los juegos de caracteres que Steve Gibson usa para su sistema "Perfect Paper Password".Ellos son "caracteres para permitir que" en lugar de "caracteres de evitar", pero parece bastante razonable para lo que quiere:

Un conjunto estándar de 64 caracteres

!#%+23456789:[email protected] 
TUVWXYZabcdefghijkmnopqrstuvwxyz 

un conjunto mayor de 88 caracteres

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

para las contraseñas pronunciables, no estoy familiarizado con los algoritmos pero es posible que desee ver en APGpwgen y como punto de partida.

+1

Además, aquí hay un generador de contraseñas pronunciables basado en C#. http://www.sloppycode.net/tools/password-generator.aspx – y0mbo

+0

Acepté esta respuesta, ya que confirma que un alfabeto limitado es el camino correcto a seguir :) No estoy de acuerdo sobre cuáles son las letras correctas (voy a ¡excluya D ahora también!) Otra respuesta dijo usar una fuente mejor, este es un consejo sensato pero no siempre es posible con las aplicaciones web. Gracias a todos: D – Loofer

+0

No estoy seguro de por qué el segundo conjunto incluye el O, pero ninguno de 1, I, l. – tkruse

9

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

Dependiendo de sus requisitos de resistencia que terminan con fácil de recordar y comunicar las contraseñas como:

  • limón% mostrador
  • papel & boy32hat

Tenga en cuenta que en ocasiones recibe combinaciones de palabras interesantes o inapropiadas (te dejaré usar tu imaginación). Por lo general, tengo un botón que permite la generación de una nueva contraseña si la que presenta no es del agrado.

Como regla, solo use símbolos que las personas comúnmente conocen el nombre. En un teclado estándar de EE. UU. Evitaría ~ `'/ \^

Supongo que esto respondió más a la pregunta de su jinete que a su pregunta principal. ..

¡Buena suerte!

+1

Esto también es extremadamente inseguro, ya que las herramientas de descifrado de contraseñas utilizan con precisión una combinación de palabras de diccionario y caracteres especiales aleatorios para adivinar la contraseña. – Laurent

+0

Me recuerda las contraseñas de Compuserve. Aún puedo recordar el mío. Taper? Obrero – slothbear

+0

James, su respuesta depende de la función rand() de PHP, que no es un generador seguro de números aleatorios. – tqbf

3

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

  • lmn% Desk
  • p @ por & b0y32H @ t

legible siendo sobre todo humano.

3

Como otra opción, puede usar una fuente de monoespacio/terminal como servicio de mensajería para imprimir las contraseñas. Caracteres similares deberían ser mucho más distinguibles de esa manera.

6

Lea Choosing Secure Passwords.

Un tidbit interesante desde allí: para obtener contraseñas más seguras, asegúrese de que algunos números y caracteres especiales aparezcan en el medio. Los programas de crackeo los buscan al principio y terminan antes.

1

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

De cualquier forma, el posible ataque contra este sistema va a ser contra el generador de números aleatorios, así que asegúrese de estar usando uno criptográficamente fuerte. Si utiliza la función de rand estándar de PHP, se atacará registrando y restableciendo miles de contraseñas para muestrear el estado de RNG y luego predecir el estado de RNG restante, lo que reducirá el número de contraseñas posibles que un atacante necesita para probar.

2

Para las contraseñas legibles por personas, recientemente utilicé un script PHP muy similar al siguiente. Funcionó bien De acuerdo, las contraseñas no serán increíblemente seguras (ya que son propensas a ataques de diccionario), pero para las contraseñas memorizables o al menos legibles, funciona bien. Sin embargo, esta función no debe usarse tal como está, es más para ilustración que 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; 
} 
3

Para un cliente internacional hace varios años, tenía que generar contraseñas aleatorias seguras, que fueron entonces se fusionaron en documentos por correo por mi cliente y se envían por correo postal a los beneficiarios en 40 países. Sin saber qué tipo de letra iba a usarse en los documentos, utilicé una lista de personajes como Steve Gibson 64-character para eliminar la confusión entre glifos similares.

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

para reducir las posibilidades de palabras inapropiadas u ofensivas que se genere (en Inglés o en las lenguas de los destinatarios), limité carreras de caracteres alfa consecutivos a dos, con números o caracteres de puntuación betwee:

Es4tU$sA6 
[email protected] 

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

1

Un acercamiento que comienza puede ser generar sílabas inglesas generalmente válidas, mezclarlas, luego lanzar una conversión text-> l33t. Se ha trabajado en gramáticas generacionales de lenguaje natural, por lo que una de ellas podría ayudar.

E.g. ah ul ing son todas las sílabas válidas o cercanas a ella ... mezclarlas -> Ingulah ... l33t it -> 1ngu4h. ¿Es lo mejor que hay? Nah. Pero al menos es semiprononable (si hablas l33t) y es más seguro computacionalmente.

2

En mi escuela de postgrado (ingeniería eléctrica, techie), todas las cuentas de la computadora se inicializaron con contraseñas que, supongo, fueron generadas por una utilidad de Linux estándar. Consistían en tres sílabas aleatorias, con tres letras minúsculas en cada sílaba. El resultado fue razonablemente seguro (en el 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 acerca de las contraseñas en general, de un profesional de la red de seguridad: son terribles, por varias razones, incluyendo:

  • Generalmente se rompen fácilmente, ya sea a través de ingeniería social o con el software de ataque, especialmente si conoce cualquier cosa acerca de su objetivo.

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

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

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

Si necesita verdaderamente autenticación segura, múltiples factores (o de dos factores) es el mecanismo aceptado por la industria. Los "dos factores" son generalmente algo que tiene (como una tarjeta de acceso) y algo que sabe que lo habilita (como un PIN). Ninguno de los dos trabaja sin el otro; necesita los dos.

Por otro lado, tenga en cuenta el nivel de seguridad que realmente necesita. ¿Qué estás protegiendo? ¿Qué tan mal los quieren los "chicos malos" y cuáles son las consecuencias si lo hacen? Las posibilidades son, "Its @ Secret!" es más que suficientemente bueno. :-)

+1

Si te interesa, la contraseña era "Yahweh" con mayúscula Y. Tampoco soy vidente. Si hubiera tenido una conversación de 5 minutos con nuestro escritor de tecnología, lo habría adivinado también, primero intente. –

1
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; 

} 
+0

¡Bienvenido a Stack Overflow! Incluya alguna introducción o resumen a sus respuestas, y trate de limitar el tamaño de los fragmentos de código tanto como sea posible. –

Cuestiones relacionadas