Un generador de contraseñas aleatorias es un programa de software o dispositivo de hardware que toma la entrada de un generador de números aleatorios o pseudoaleatorios y genera automáticamente una contraseña . Las contraseñas aleatorias se pueden generar manualmente, usando fuentes simples de aleatoriedad como dados o monedas, o se pueden generar usando una computadora.
Si bien hay muchos ejemplos de programas de generación de contraseñas "aleatorias" disponibles en Internet, generar aleatoriedad puede ser complicado y muchos programas no generan caracteres aleatorios de una manera que garantice una seguridad sólida. Una recomendación común es utilizar herramientas de seguridad de código abierto siempre que sea posible, ya que permiten verificaciones independientes de la calidad de los métodos utilizados. Tenga en cuenta que simplemente generar una contraseña al azar no garantiza que la contraseña sea segura, porque es posible, aunque muy poco probable, generar una contraseña fácil de adivinar o descifrar. De hecho, no es necesario que una contraseña haya sido producida por un proceso perfectamente aleatorio: solo tiene que ser lo suficientemente difícil de adivinar.
Un generador de contraseñas puede formar parte de un administrador de contraseñas . Cuando una política de contraseñas impone reglas complejas, puede ser más fácil utilizar un generador de contraseñas basado en ese conjunto de reglas que crear contraseñas manualmente.
Las cadenas largas de caracteres aleatorios son difíciles de memorizar para la mayoría de las personas. Los hash mnemónicos , que convierten de forma reversible cadenas aleatorias en contraseñas más memorables, pueden mejorar sustancialmente la facilidad de memorización. Como el hash puede ser procesado por una computadora para recuperar la cadena original de 60 bits, tiene al menos tanta información como la cadena original. [1] Se utilizan técnicas similares en el deporte de la memoria .
El enfoque ingenuo
Aquí hay dos ejemplos de código que un programador que no está familiarizado con las limitaciones de los generadores de números aleatorios en las bibliotecas de programación estándar podría implementar:
C
# include # include # include int main ( void ) { / * Longitud de la contraseña * / unsigned short int length = 8 ; / * Número de semilla para rand () * / srand (( unsigned int ) time ( 0 )); / * Caracteres ASCII 33 a 126 * / while ( longitud - ) { putchar ( rand () % 94 + 33 ); } printf ( " \ n " ); return EXIT_SUCCESS ; }
En este caso, la función C estándar rand , que es un generador de números pseudoaleatorios , se siembra inicialmente usando el tiempo de funciones C , pero las iteraciones posteriores usan rand en su lugar. De acuerdo con el estándar ANSI C, el tiempo devuelve un valor de tipo tiempo t , que está definido por la implementación, pero más comúnmente un entero de 32 bits que contiene el número actual de segundos desde el 1 de enero de 1970 ( ver: tiempo Unix ). Hay alrededor de 31 millones de segundos en un año, por lo que un atacante que conoce el año (un asunto simple en situaciones en las que la política de contraseñas exige cambios frecuentes de contraseña ) y el ID de proceso con el que se generó la contraseña, se enfrenta a un número relativamente pequeño, por estándares criptográficos, de opciones para probar. Si el atacante sabe con mayor precisión cuándo se generó la contraseña, se enfrenta a un número aún menor de candidatos para probar, una falla grave en esta implementación.
En situaciones en las que el atacante puede obtener una versión encriptada de la contraseña, dicha prueba se puede realizar con la suficiente rapidez como para que se puedan verificar algunos millones de contraseñas de prueba en cuestión de segundos. Ver: descifrado de contraseñas .
La función rand presenta otro problema. Todos los generadores de números pseudoaleatorios tienen una memoria interna o un estado. El tamaño de ese estado determina el número máximo de valores diferentes que puede producir: un estado de n bits puede producir como máximovalores diferentes. En muchos sistemas, rand tiene un estado de 31 o 32 bits, que ya es una limitación de seguridad significativa. La documentación de Microsoft no describe el estado interno de la implementación de Visual C ++ de la biblioteca estándar de C rand, pero solo tiene 32767 salidas posibles (15 bits) por llamada. [2] Microsoft recomienda que se utilice una función diferente y más segura, rand_s, en su lugar. La salida de rand_s es criptográficamente segura, según Microsoft, y no usa la semilla cargada por la función srand. Sin embargo, su interfaz de programación difiere de rand. [3]
PHP
función pass_gen ( int $ longitud = 8 ) : string { $ pass = array (); para ( $ i = 0 ; $ i < $ longitud ; $ i ++ ) { $ paso [] = chr ( mt_rand ( 32 , 126 )); } return implosión ( $ pase ); }
En el segundo caso, se usa la función PHP microtime [4] , que devuelve la marca de tiempo actual de Unix con microsegundos. Esto aumenta la cantidad de posibilidades, pero alguien con una buena suposición de cuándo se generó la contraseña, por ejemplo, la fecha en que un empleado comenzó a trabajar, todavía tiene un espacio de búsqueda razonablemente pequeño. Además, algunos sistemas operativos no brindan tiempo para una resolución de microsegundos, lo que reduce drásticamente el número de opciones. Finalmente, la función rand [5] usualmente usa la función C rand subyacente , y puede tener un espacio de estado pequeño, dependiendo de cómo se implemente. Un generador de números aleatorios alternativo, mt_rand, que se basa en el generador de números pseudoaleatorios Mersenne Twister , está disponible en PHP, pero también tiene un estado de 32 bits. Hay propuestas para agregar una fuerte generación de números aleatorios a PHP. [6]
Métodos más fuertes
Existe una variedad de métodos para generar contraseñas aleatorias sólidas y criptográficamente seguras. En las plataformas Unix , / dev / random y / dev / urandom se usan comúnmente, ya sea mediante programación o junto con un programa como makepasswd. [7] Los programadores de Windows pueden utilizar la función de interfaz de programación de aplicaciones criptográficas CryptGenRandom . El lenguaje de programación Java incluye una clase llamada SecureRandom . Otra posibilidad es derivar la aleatoriedad midiendo algún fenómeno externo, como cronometrar la entrada del teclado del usuario.
Muchos sistemas informáticos ya tienen una aplicación (normalmente denominada "apg") para implementar FIPS 181. [8] FIPS 181 —Generador automático de contraseñas — describe un proceso estándar para convertir bits aleatorios (de un generador de números aleatorios de hardware) en palabras algo pronunciables " "adecuado para una frase de contraseña. [9] Sin embargo, en 1994 se descubrió un ataque al algoritmo FIPS 181, de modo que un atacante puede esperar, en promedio, entrar en el 1% de las cuentas que tienen contraseñas basadas en el algoritmo, después de buscar solo 1,6 millones de contraseñas. Esto se debe a la falta de uniformidad en la distribución de las contraseñas generadas, que se puede solucionar utilizando contraseñas más largas o modificando el algoritmo. [10] [11]
Intento
Aquí hay una muestra de código que usa / dev / urandom para generar una contraseña con una función Bash simple . Esta función toma la longitud de la contraseña como parámetro o usa 16 por defecto:
función mkpw () { LC_ALL = C tr -dc '[: gráfico:]' | cabeza -c $ { 1 : - 16 } ; eco ; }
Java
Aquí hay un ejemplo de código (adaptado de la clase PasswordGenerator [12] ) que usa SecureRandom para generar una contraseña de 10 caracteres hexadecimales:
Cadena [] símbolos = { "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "a" , "b" , "c" , "d" , "e" , "f" }; int longitud = 10 ; Aleatorio aleatorio = SecureRandom . getInstanceStrong (); // a partir de JDK 8, esto debería devolver el algoritmo más fuerte disponible para JVM StringBuilder sb = new StringBuilder ( length ); para ( int i = 0 ; i < longitud ; i ++ ) { int indexRandom = random . nextInt ( símbolos . longitud ); sb . añadir ( símbolos [ indexRandom ] ); } Cadena de contraseña = sb . toString ();
Mecanografiado
Un ejemplo del uso del módulo "cripto" integrado en Node.js
importar * como cripto desde "cripto" ;función generar ( longitud = 16 ) { const mayúsculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; const minúscula = "abcdefghijklmnopqrstuvwxyz" ; números constantes = "0123456789" ; const símbolos = "! \" # $% & '() * +, -. / :; <=>? @ [\\] ^ _ `{|} ~" ; const todo = mayúsculas + minúsculas + números + símbolos ; let password = "" ; for ( let index = 0 ; index < length ; index ++ ) { const randomNumber = crypto . randomInt ( all . length ); password + = all . charAt ( randomNumber ); } return password ; }
JavaScript
Este ejemplo usa Math.random (). Su código forma parte del manual: [13]
función generar ( longitud = 12 ) { var mayúscula = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; var minúscula = 'abcdefghijklmnopqrstuvwxyz' ; var numeros = '0123456789' ; var símbolos = '! "# $% & \' () * +, -. / :; <=>? @ [\\] ^ _` {|} ~ ' ; var todos = mayúsculas + minúsculas + números + símbolos ; var contraseña = '' ; for ( var index = 0 ; index < length ; index ++ ) { var character = Math . floor ( Math . random () * all . length ); contraseña + = all . charAt ( character ) ; } devolver contraseña ; }
Perl
Este ejemplo usa el módulo Crypt :: Random :: Source para encontrar una fuente de números aleatorios fuertes (que depende de la plataforma).
use Crypt :: Random :: Source qw (get_strong) ;while ( length ( $ out ) < 15 ) { my $ a = get_ strong ( 1 ); $ a = ~ s / [^ [: gráfico:]] // g ; $ fuera . = $ a ; } imprimir $ out ;
Pitón
Hasta la versión 3.5.10, el módulo aleatorio incluye una clase SystemRandom que obtiene bits aleatorios de grado criptográfico de / dev / urandom en un sistema similar a Unix, incluidos Linux y macOS, mientras que en Windows usa CryptGenRandom. [14] [15]
Sin embargo, a partir de la versión 3.6, ya no se recomienda el uso de random.SystemRandom () y se debe preferir el módulo de secretos (que tiene una sintaxis similar).
Aquí hay una secuencia de comandos de Python simple que muestra la generación de contraseñas antes y después de la aparición del módulo de secretos:
#! / usr / bin / env python3importar sysimportar cadenasi sys . version_info < ( 3 , 6 ): # Python 3.5.10 o inferior importar al azarmás : # Python 3.6 y superior importar secretosdef getRandPwd ( longitud ): alfabeto = cadena . ascii_letters + cadena . dígitos # [a-zA-Z0-9] si sys . version_info < ( 3 , 6 ): rng = aleatorio . SystemRandom () volver '' . join ( rng . elección ( alfabeto ) para _ en rango ( longitud )) otra cosa : volver '' . unirse ( secretos . elección ( alfabeto ) para _ en rango ( longitud ))contraseña = getRandPwd ( 32 )imprimir ( contraseña )
PHP
Un programa PHP puede abrir y leer desde / dev / urandom, si está disponible, o invocar las utilidades de Microsoft. [16] Una tercera opción, si OpenSSL está disponible, es emplear la función openssl_random_pseudo_bytes '.' [17]
Métodos mecánicos
Otro método más consiste en utilizar dispositivos físicos, como dados, para generar la aleatoriedad. Una forma sencilla de hacer esto utiliza una tabla de caracteres de 6 por 6. La primera tirada selecciona una fila en la tabla y la segunda una columna. Entonces, por ejemplo, un resultado de 2 seguido de un resultado de 4 seleccionaría la letra "j" de la siguiente tabla de fraccionamiento . [18] Para generar caracteres en mayúsculas / minúsculas o algunos símbolos se puede usar un lanzamiento de moneda, cara en mayúscula, cruz en minúscula. Si se seleccionó un dígito en las tiradas de dados, un lanzamiento de moneda cara podría seleccionar el símbolo sobre él en un teclado estándar, como el '$' sobre el '4' en lugar del '4'.
1 2 3 4 5 6 1 a B C D mi F 2 gramo h I j k l 3 metro norte o pag q r 4 s t tu v w X 5 y z 0 1 2 3 6 4 5 6 7 8 9
Tipo y seguridad de la contraseña generada
Los generadores de contraseñas aleatorias normalmente generan una cadena de símbolos de longitud especificada. Estos pueden ser caracteres individuales de algún conjunto de caracteres, sílabas diseñadas para formar contraseñas pronunciables o palabras de alguna lista de palabras para formar una frase de contraseña . El programa se puede personalizar para garantizar que la contraseña resultante cumpla con la política de contraseñas local, por ejemplo, produciendo siempre una combinación de letras, números y caracteres especiales. Estas políticas suelen reducir la fuerza ligeramente por debajo de la fórmula que sigue, porque los símbolos ya no se producen de forma independiente.
La fuerza de la contraseña de una contraseña aleatoria contra un ataque en particular ( búsqueda de fuerza bruta ) se puede calcular calculando la entropía de información del proceso aleatorio que la produjo. Si cada símbolo de la contraseña se produce de forma independiente y con probabilidad uniforme, la entropía en bits viene dada por la fórmula
donde N es el número de símbolos posibles y L es el número de símbolos en la contraseña. La función log 2 es el logaritmo en base 2 . Normalmente, H se mide en bits . [19] [20]
Entropía por símbolo para diferentes conjuntos de símbolos Conjunto de símbolos Número de símbolos N Entropía por símbolo H Números arábigos (0–9) (p. Ej. PIN ) 10 3,32 bits Números hexadecimales (0–9, A – F) (p. Ej., Clave WEP ) dieciséis 4,00 bits Alfabeto latino que no distingue entre mayúsculas y minúsculas (a – zo A – Z) 26 4,70 bits Caso insensible alfanumérico (a-z o A-Z, 0-9) 36 5,17 bits Alfabeto latino sensible a mayúsculas y minúsculas (a – z, A – Z) 52 5.70 bits Alfanumérico sensible a mayúsculas y minúsculas (a – z, A – Z, 0–9) 62 5,95 bits Todos los caracteres imprimibles ASCII 95 6,55 bits Lista de palabras de Diceware 7776 12,9 bits
Entropía de contraseña deseada H | Numerales arábigos | Hexadecimal | Alfabeto latino que no distingue entre mayúsculas y minúsculas | Entre mayúsculas y minúsculas alfanumérica | Alfabeto latino sensible a mayúsculas y minúsculas | Alfanumérico sensible a mayúsculas y minúsculas | Todos los caracteres imprimibles ASCII | Todos los caracteres imprimibles ASCII extendidos | Lista de palabras de Diceware |
---|---|---|---|---|---|---|---|---|---|
32 bits | 10 | 8 | 7 | 7 | 6 | 6 | 5 | 5 | 3 |
40 bits | 13 | 10 | 9 | 8 | 8 | 7 | 7 | 6 | 4 |
64 bits | 20 | dieciséis | 14 | 13 | 12 | 11 | 10 | 9 | 5 |
80 bits | 25 | 20 | 18 | dieciséis | 15 | 14 | 13 | 11 | 7 |
96 bits | 29 | 24 | 21 | 19 | 17 | 17 | 15 | 13 | 8 |
128 bits | 39 | 32 | 28 | 25 | 23 | 22 | 20 | 17 | 10 |
160 bits | 49 | 40 | 35 | 31 | 29 | 27 | 25 | 21 | 13 |
192 bits | 58 | 48 | 41 | 38 | 34 | 33 | 30 | 25 | 15 |
224 bits | 68 | 56 | 48 | 44 | 40 | 38 | 35 | 29 | 18 |
256 bits | 78 | 64 | 55 | 50 | 45 | 43 | 39 | 33 | 20 |
384 bits | 116 | 96 | 82 | 75 | 68 | sesenta y cinco | 59 | 50 | 30 |
512 bits | 155 | 128 | 109 | 100 | 90 | 86 | 78 | 66 | 40 |
1024 bits | 309 | 256 | 218 | 199 | 180 | 172 | 156 | 132 | 80 |
Cualquier generador de contraseñas está limitado por el espacio de estado del generador de números pseudoaleatorios utilizado si se basa en uno. Por lo tanto, una contraseña generada con un generador de 32 bits está limitada a una entropía de 32 bits, independientemente del número de caracteres que contenga la contraseña.
Sin embargo, tenga en cuenta que un tipo diferente de ataque podría tener éxito contra una contraseña evaluada como "muy segura" según el cálculo anterior.
Programas y sitios web generadores de contraseñas
Hay una gran cantidad de sitios web y programas de generación de contraseñas disponibles en Internet. Su calidad varía y puede ser difícil de evaluar si no hay una descripción clara de la fuente de aleatoriedad que se utiliza y si no se proporciona el código fuente para permitir la verificación de las afirmaciones. Además, y probablemente lo más importante, la transmisión de contraseñas candidatas a través de Internet plantea problemas de seguridad obvios, especialmente si la conexión al programa del sitio de generación de contraseñas no está debidamente protegida o si el sitio está comprometido de alguna manera. Sin un canal seguro , no es posible evitar las escuchas, especialmente en redes públicas como Internet . Una posible solución a este problema es generar la contraseña utilizando un lenguaje de programación del lado del cliente como JavaScript. La ventaja de este enfoque es que la contraseña generada permanece en la computadora cliente y no se transmite hacia o desde un servidor externo.
Ver también
- Generador de números pseudoaleatorios criptográficamente seguro
- Diceware
- Generador de números aleatorios de hardware
- Tamaño de la clave
- Parámetro de longitud de la contraseña
- Administrador de contraseñas
Referencias
- ^ Ghazvininejad, Marjan; Knight, Kevin (mayo-junio de 2015). "Cómo memorizar una cadena aleatoria de 60 bits" (PDF) . Actas de la Conferencia 2015 del Capítulo Norteamericano de la Asociación de Lingüística Computacional: Tecnologías del Lenguaje Humano . Actas de la Conferencia 2015 del Capítulo Norteamericano de la Asociación de Lingüística Computacional: Tecnologías del Lenguaje Humano. Denver, Colorado: Asociación de Lingüística Computacional. págs. 1569-1575. doi : 10.3115 / v1 / N15-1180 . S2CID 8028691 .
- ^ "RAND_MAX" . docs.microsoft.com .
- ^ "Documentación de Visual Studio 2005 Retirada" . Centro de descarga de Microsoft .
- ^ "PHP: microtime - Manual" . php.net .
- ^ "PHP: rand - Manual" . php.net .
- ^ "Copia archivada" . Archivado desde el original el 19 de octubre de 2008 . Consultado el 17 de octubre de 2008 .CS1 maint: copia archivada como título ( enlace )
- ^ "Linux / UNIX: generación de contraseña aleatoria con mkpasswd / makepasswd / pwgen" . cyberciti.biz . Noviembre de 2007.
- ^ "StrongPasswords - Wiki de ayuda de la comunidad" . help.ubuntu.com . Consultado el 25 de marzo de 2016 .
- ^ NIST. Generador de contraseñas automatizado estándar FIPS 181
- ^ Shay, Richard; Kelley, Patrick Gage; Komanduri, Saranga; Mazurek, Michelle L .; Ur, Blase; Vidas, Timothy; Bauer, Lujo; Christin, Nicolas; Cranor, Lorrie Faith (2012). Grapa correcta de la batería del caballo: exploración de la usabilidad de las frases de contraseña asignadas por el sistema (PDF) . Actas de SOUPS '12 del Octavo Simposio sobre Privacidad y Seguridad Usable. doi : 10.1145 / 2335356.2335366 .
- ^ Ganesan, Ravi; Davies, Chris (1994). "Un nuevo ataque a los generadores de contraseñas pronunciables al azar" (PDF) . Actas de la 17ª {NIST} - {NCSC} Conferencia Nacional de Seguridad Informática . NIST: 184-197 . Consultado el 17 de diciembre de 2014 .
- ^ "¡Califica mi generador de contraseñas aleatorias!" . Crypto .
- ^ "Generar contraseña segura en línea - RandomPasswordGenerator.org" . randompasswordgenerator.org .
- ^ "9.6. Aleatorio - Generar números pseudoaleatorios - Documentación de Python 3.5.1" . docs.python.org . Consultado el 25 de marzo de 2016 .
- ^ "16.1. Os - Varias interfaces del sistema operativo - Documentación de Python 3.5.1" . docs.python.org . Consultado el 25 de marzo de 2016 .
- ^ " " Seguro "números aleatorios en PHP" . ¿Qué es la WTF diaria? . 18 de abril de 2010.
- ^ "PHP: openssl_random_pseudo_bytes - Manual" . php.net . Consultado el 25 de marzo de 2016 .
- ^ Levine, John R., Ed .: Secretos de Internet , segunda edición, página 831 y siguientes. John Wiley e hijos.
- ^ Schneier, B: Criptografía aplicada , segunda edición, página 233 y siguientes. John Wiley e hijos.
- ^ Burr, WE; Dodson, DF; Polk, WT (2006). "Directriz de autenticación electrónica" (PDF) . NIST. doi : 10.6028 / NIST.SP.800-63v1.0.2 . Cite journal requiere
|journal=
( ayuda )
enlaces externos
- Número aleatorio criptográficamente seguro en Windows sin usar CryptoAPI de MSDN
- RFC 4086 sobre recomendaciones de aleatoriedad para la seguridad (reemplaza al anterior RFC 1750).