Artículo sobre seguridad explicado para dummies en el que se explica lo que todo el mundo debería saber sobre contraseñas. Enfatizando en cómo elegir contraseñas seguras que sean “imposibles” de descifrar.

Antes que nada voy a dejar bien claro una cosa, no puede existir una contraseña que sea imposible de ser descubierta. Es decir, no hay absolutamente nada que esté 100% seguro con una contraseña, y esto muy fácil de explicar, siempre puedes ir probando una a una todas las contraseñas posibles hasta dar con la que funcione.
Por esa razón se suele clasificar una contraseña por el tiempo que se tardaría en descifrar. Una buena contraseña debería de tener una media de unos cuantos cientos de años para considerarse segura del todo, y decenas de años para ser una buena contraseña.
Para saber cómo elegir una contraseña es necesario saber cómo pueden atacarla. No voy a explicar paso a paso cómo se crackean las contraseñas porque este tutorial no es de cracking, si no de seguridad. Pero sí que voy a comentar las distintas técnicas que existen porque es necesario saberlo.
Lo primero que hay que tener bien claro es que lo “bien” que protege una contraseña no depende únicamente de la contraseña en sí. La seguridad está definida por el eslabón más débil de la cadena, no por el más fuerte.
Las contraseñas se utilizan para, o bien criptografiar algo, o bien para permitir el acceso de algún contenido remoto. Obviamente, si tenemos acceso al contenido, pero no a la contraseña, no nos importa saberla, ya que podemos ver lo que protege sin ella. Por ejemplo, la contraseña de tu usuario de windows no vale para proteger tus documentos ya que puedes arrancar el ordenador desde linux o poner el disco duro en otro windows y ver todos los datos de todas las carpetas sin problemas. (Aunque creo que con Win7 eso ha sido solucionado criptografiando los documentos)
Antes de tratar las contraseñas en sí también quiero resaltar unas cuantas cosas sobre internet. Como expliqué en otro de mis artículos(external link), internet no es un medio seguro para transmitir contraseñas. Siempre que una página web te pide que inicies sesión, tu usuario y contraseña tiene que pasar de tu ordenador al servidor, y si el servidor no utiliza https la información pasará como texto plano (es decir, cualquier persona puede ver la contraseña), y por tanto la contraseña no será segura, por muy complicada que sea esta.
Por suerte, la mayor parte de páginas web importantes utilizan https, así que esto no es un problema ya que no se conocen vulnerabilidades importantes de ese protocolo.
Otro tema importante es dónde se guardan las contraseñas. Y no me refiero a únicamente la contraseña por nuestra parte, es decir, un “me acuerdo de ella y no la apunto en ningún lado” no quiere decir nada, ya que la contraseña se tiene que guardar como mínimo en 2 sitios distintos. Uno somos nosotros (y todos los administradores de contraseñas que usemos), y el otro es el sitio en el que se nos pide la contraseña.
Por ejemplo, si example.com me pide mi usuario y contraseña, yo tengo que saberme la contraseña, pero example.com también la tiene que saber, ya que las tiene que comparar para decidir si la contraseña es correcta o no.
Aunque este segundo sitio donde se tiene que guardar contraseña no es necesaria si se trata de temas de encriptación, pero eso lo explicaré más adelante.
Si somos dueños de una página web donde los usuarios tienen usuarios y contraseñas, nuestro objetivo es guardar las contraseñas encriptadas para evitar que si alguien toma el control de la página web las contraseñas de los usuarios queden comprometidas.
Hay 3 tipos de encriptación básica, la encriptación en un sentido, la simétrica y la asimétrica.
La simétrica es la más conocida para la gente que no sabe del tema. Se resume en que con una única contraseña puedes encriptar los datos o desencriptarlos. La asimétrica necesita dos claves, una de encriptación y otra para desencriptar, y es la usada por https y el openpgp.
Y la que más nos interesa ahora es la de un sentido. Un método de encriptación de un sentido usa una única contraseña, pero a diferencia de la simétrica, es imposible desencriptar los datos. ¿Imposible? Si, al 100%, no puedes recuperar los datos. Son funciones que matemáticamente se llamarían sin inversa. (Un hash es un buen ejemplo de este tipo de funciones)
¿Pero para qué queremos encriptar algo si luego no lo podemos desencriptar? Es muy simple. Cuando una persona crea su contraseña esta se encripta de esta forma, y se guardan los datos encriptados (no la contraseña), de una forma muy segura ya que no se puede sacar de los datos encriptados la contraseña original. Ahora, cuando el usuario se quiere conectar envía su contraseña al servidor, y este encripta la clave y compara las claves encriptadas, si coinciden es porque la clave es correcta.
Es decir, en vez de comprobar la clave en sí, comprobamos que el resultado de encriptar las claves coincida.
Esto es importante porque si el sistema que comprueba las contraseñas funciona así es imposible sacar la contraseña de ahí. (Aunque sí existen formas de obtener la contraseña que están explicados al final del artículo)
Y por último, el otro lugar donde se guarda la contraseña es en nuestro sistema. Si tenemos buena memoria esto no es un problema ya que no necesitamos apuntarla en ningún lado, pero no todos tenemos suficiente memoria para tanto código, y además está la incomodidad de tener que escribir las contraseñas cada vez. ¿Quién no ha usado nunca algún programa de almacenamiento de contraseñas? Creo que casi todo el mundo le da a “guardar contraseña” en el firefox/IE/. Esto quiere decir que además de en nuestra cabeza, las contraseñas también se guardan en el ordenador.
Y hay que decir que no todos los programas que almacenan contraseñas lo hacen de forma segura, la mayoría lo hacen escribiéndolas en un simple archivo. Otros más complejos te piden una contraseña maestra con la que se encripta y desencripta ese archivo, de tal forma que con escribir una única contraseña todas las demás se “autocompletan” solas.
Pero ya hemos dicho que el nivel de un sistema depende de su eslabón más débil. Si la contraseña maestra es de dudosa calidad, todas las demás estarán comprometidas sean lo difíciles que sean, ya que cualquiera que consiga la maestra podrá leer las demás.
Y qué decir de sistemas dónde las contraseñas se guardan sin encriptar… Firefox e Internet Explorer por defecto no encriptan las contraseñas, y no se si Chrome lo hace, pero lo dudo.
En resumen, las contraseñas se tienen que almacenar en 2 sitios como mínimo, y hay que tener cuidado porque pueden ser espiadas al transmitirse de un lado a otro. Y transmitirse no tiene por qué ser en internet, un keylogger es un programa que apunta las teclas que presionas, apuntando también las contraseñas que escribas aunque no vayan a pasar por internet.
Pero antes de hablar sobre las contraseñas en sí, voy a indicar un ataque extra, el más peligroso ya que no depende de nosotros ni de la clave. Son fallos en el protocolo en el que se usan las contraseñas.
Un ejemplo es el sistema WEP del wifi. Usando una técnica de inyección de datos se puede conseguir cualquier clave, sea lo complicada que sea, en menos de 20 minutos. Son técnicas estadísticas, consiste en ir probando claves y leer los datos encriptados, dependiendo de cómo salgan los datos puedes ir acercándote estadísticamente a la clave real, hasta que aciertas. Realmente vas como asegurando dígitos de la clave hasta que aseguras todos.
Este tipo de problemas de seguridad siempre suelen existir, y son de los mayores problemas que se tienen a la hora de crear sistemas encriptados. Son métodos que se utilizan para sacar las contraseñas de los zip, por ejemplo. La única forma que hay de evitarlos es usar otro sistema del que aún no se conozcan estas vulnerabilidades.
Voy a comentar rápidamente los sistemas criptográficos y por qué no necesitan guardar la contraseña.
Cuando encriptas algo usando un algoritmo concreto, la clave define una serie de parámetros en la fórmula matemática usada. Cuando queremos desencriptar algo, el sistema no nos pide la contraseña para comprobar si es cierta o no, si no para meterla otra vez en la fórmula matemática inversa. Si al pasar los datos criptografiados da algo coherente, la contraseña es correcta, si por el contrario salen números al azar, la contraseña era incorrecta. No necesita guardar la contraseña en ningún lado, y por tanto, es imposible que obtengan la contraseña del archivo. Aunque eso no quiere decir que no puedan obtener los datos. Si las fórmulas criptográficas son pobres, el sistema puede ser desencriptado sin necesidad de la contraseña.
Para acabar voy a explicar los métodos que utilizan los crackers para conseguir una contraseña si no han podido hacer nada de lo anterior (ya que siempre es mucho más rápido).
El primer intento siempre es un ataque diccionario. Se llama así porque consiste únicamente en probar combinaciones de palabras y números de una lista (o diccionario).
Esto es muy útil ya que para memorizar una contraseña es mucho más fácil usar palabras que conozcamos y combinarlas, a veces intercalando números, pero en general son conjuntos de palabras.
Por ejemplo, una contraseña mala sería “trenazul”, ya que la palabra “tren” y la palabra “azul” existen en nuestro idioma, y por tanto pueden encontrarse en un diccionario.
Pero no nos confiemos, los diccionarios usados para encontrar claves pueden estar mucho más orientados a nosotros que el simple hecho de estar en un diccionario de algún idioma. Por ejemplo, incluir en el diccionario de búsqueda datos como el nombre, apellidos, nombre de la empresa, de los hijos, padres, domicilio, nick en internet, correo electrónico, fecha de nacimiento, o el peor de todos los casos, trozos de otras contraseñas conocidas; es algo común a la hora de buscar contraseñas, y por tanto debemos evitarlo a toda costa si queremos una contraseña segura.
El hecho de usar trozos de otras contraseñas en una mas difícil es algo muy típico que además da una falsa sensación de seguridad. Pongamos que tengo una contraseña “AAAA” y otra contraseña “01234”, obviamente en este ejemplo las contraseñas son muy sencillas, pero imaginemos que no lo son, pero que por algún motivo (espiadas mientras iniciaba sesión en una página web, o lo que sea) las contraseñas han sido comprometidas. Si a la hora de crear mi contraseña importante he usado una combinación de estas, por ejemplo “trenAAAAazul012345”, esta contraseña también está comprometida a pesar de parecer segura. Es mucho más larga, suma lo complicado que eran las otras contraseñas, pero, ahora todas las palabras pueden estar en un diccionario de búsqueda de claves. Resultado: Contraseña crackeada en poco tiempo.
Por tanto, NUNCA debemos de usar para la contraseña “buena” trozos de contraseñas menos seguras, ni palabras relacionadas con nosotros ni palabras con sentido (ni uniones de dichas palabras). Y los números intercalados no ayudan tampoco. “tren42azul” también es una mala contraseña, ya que conjuntos pequeños de números también pueden estar en el diccionario del atacante.
Esta forma de encontrar las contraseñas es muy potente si el que nos ataca tiene información sobre nosotros. Por ejemplo, la vez que ″hackearon″ la cuenta de correo electrónico de Sarah Palin, encontrar la contraseña fue tan sencillo como probar con fechas de nacimiento y demás datos que el ″cracker″ obtuvo de wikipedia. Es un buen ejemplo de seguridad pésima, con contraseñas así casi se merece que consiguieran la contraseña xD
El último sistema se llama ataque por fuerza bruta. Este método nunca falla, y digo nunca falla porque matemáticamente siempre funciona.
Consiste en ir probando una por una todas las contraseñas posibles hasta dar con la correcta. ¿Sencillo no? Ya, pero se deja para el final por una buena razón, es muy lenta. Y cuando digo MUY lenta lo digo en mayúsculas.
Una buena contraseña puede tardar miles de años en ser encontrada incluso usando cientos de ordenadores día y noche probando contraseñas. No exagero. Se considera que esas contraseñas no pueden ser obtenidas o son completamente seguras cuando eso sucede.
Pero hay pequeños “hacks” que se pueden aplicar para reducir drásticamente el tiempo de crackeo de una contraseña. El primero es saber la longitud de la contraseña. No es lo mismo probar todas las combinaciones posibles de contraseñas que hay de longitud 4, que no saber ni eso, y tener que probar todas las contraseñas de longitud 1, luego las de 2, las de 3, … así hasta dar con la correcta.
Veamos, una contraseña solo de números de longitud 1 puede ser: 0, 1, 2, 3, 4, 5, 6, 7, 8 o 9. ¿Cuánto tarda el ordenador en probar esas 10 posibilidades? Milésimas de segundo, vale, pero ¿Y si después tiene que comprobar las de longitud 2? Ah! Eso ya son 10^2=100 posibilidades distintas, ¿Y si luego tiene que probar las de longitud 3? Eso son 10^3=1000 posibilidades! Si sumamos son 1110 posibilidades, solo para contraseñas de entre 1 y 3 cifras numéricas. Además observamos que aumenta exponencialmente con el número de dígitos de la contraseña. ¿Qué pasa si la contraseña es de 8 cifras (aún es una contraseña muy pobre)? Eso son 10^8 posibilidades = 100000000 combinaciones, pero si además no sabemos cuántas cifras son y tenemos que probar con todas las anteriores serían 111111110 posibilidades distintas. Empieza a ponerse complicado.
Bien, ahora mismo estoy probando solo con contraseñas compuestas de dígitos, pero ¿y si tiene letras? Hay 26 letras estándar (es decir, en el alfabeto inglés), mientras que solo hay 10 dígitos distintos. Hemos multiplicado por 2.6 la dificultad en las contraseñas de longitud 1, pero hay que tener en cuenta que aumentar la longitud es exponencial.
8 dígitos son 10^8 = 10000000000 posibilidades.
8 letras son 26^8 = 208827064576 posibilidades.
Es decir, más de 2000 veces más posibilidades que antes!
Y qué decir tiene que solo estamos usando letras, pero ¿y si el sistema distingue mayúsculas de minúsculas? En vez de 26^8 serán 52^8 = 53459728531456 posibilidades. ¿Y si ahora pueden ser números, letras mayúsculas, letras minúsculas y cualquier símbolo ASCII?
Pues veamos, los caracteres imprimibles ASCII son del 0x20 al 0x7E (en hexadecimal), es decir, ¡95 símbolos diferentes!
¡¡¡Una contraseña de longitud 8 tendrá 6.634.204.312.890.625 posibilidades distintas!!!
Y eso que se trata de una clave muy cutre, 8 caracteres no son nada.
Un único ordenador normal dedicado 24h a trabajar en sacar una contraseña así tardaría 58 años como máximo en sacar esa contraseña.
NOTA: Los datos de tiempo se basan en velocidades de procesamiento de contraseñas, para un ordenador estándar, y dicen el tiempo que se tarda en probar todas las contraseñas posibles. Es decir, nos sirve para tener una idea estadística del tiempo que se tardaría en sacar una contraseña por fuerza bruta, siempre está la posibilidad de que la primera contraseña que sea la correcta, aunque la media esté en 10000 años, la contraseña puede aparecer antes. Esto es estadística y no un tiempo exacto. Si queréis calcular tiempos máximos en esta página podéis ver cuánto se tardaría: http://lastbit.com/pswcalc.asp(external link)
En resumen, una contraseña es segura solo si todos los eslabones del mecanismo de seguridad son seguros. Y para evitar que una contraseña sea crackeada tenemos que tener en cuenta la longitud, que no contenga palabras diccionario ni relacionadas con nosotros, y que contenga letras (mayúsculas y minúsculas), números y signos de puntuación. Y si la contraseña no tiene porqué ser representada como texto (es un conjunto de bytes) tenemos acceso a 256 valores distintos en vez de a 95 caracteres imprimibles ASCII.
Hay algo muy curioso sobre contraseñas llamado padding. La longitud de una contraseña es algo muy importante como he ido explicando, y que use signos de puntuación también. Vale, pues qué contraseña será más difícil de crackear (por fuerza bruta)?


Asd28!_d25Ff12?K
D0g!;!;!;!;!;!;!;!;!;

La respuesta correcta es la segunda, y además es MUCHO más fácil de recordar. La única diferencia es que la segunda es más larga ya que ambas utilizan todo el espectro de caracteres imprimibles. La palabra D0g posiblemente sea obtenible de un diccionario ya que lo único complicado es cambiar una ‘o’ por un ‘0’ (cero), y hay muchos generadores de diccionarios que hacen ese tipo de cambios típicos de letras y números a lo ″hacker″, así que eso da una falsa sensación de seguridad.
Lo importante es que para que una contraseña sea correcta tiene que serlo al completo, no vale una casi-contraseña, por tanto, aunque “D0g” esté en el diccionario, la contraseña no lo está. Y encontrar el padding es tan complicado como encontrar una contraseña cualquiera igual de larga, pero con la ventaja de ser más fácil de memorizar.
La única advertencia que tengo que decir es que hay que evitar los paddings sencillos porque si la gente empieza a usar esta técnica los crackers empezarán a probar paddings comunes. En mi ejemplo he usado uno medianamente simple, que seguro que algún jugador de Los Sims reconoce xD, y que únicamente repite 2 caracteres. Un padding puede ser cualquier cosa y puede estar hecho con cualquier tipo de caracter. Por ejemplo, usar ″”!42!42!”″ o ″”TheGame!TheGame!TheGame!”″ puede ser más seguro. Con acordarse de el número de repeticiones sobra.
Resultado: Contraseñas muy largas y completas, fáciles de recordar y muy seguras.
Edición añadida el 12/06/12:
Hace unos días hubo un leak importante de contraseñas de una web llamada LinkedIn.
En EFF han hecho un artículo muy bueno hablando sobre contraseñas dando recomendaciones para evitar que un fallo de seguridad en una web como esa no se convierta también en un fallo de seguridad para ti.
https://www.eff.org/deeplinks/2012/06/passwords-linkedin-and-beyond(external link)
Fin añadido
Espero que os haya gustado y que os sea útil. Seguramente muchos sabíais ya la mayoría de estas cosas, pero siempre está bien saber el por qué de necesitar contraseñas buenas.
Si os ha gustado el artículo, tenéis dudas, queréis comentar algo, mandarme cartas de agradecimiento, odio, muerte o lo que sea, ¡esto es un foro libre!
Si quieres comentar algo, usa este tema en el foro:
http://www.nakerium.com/foro/viewtopic.php?f=6&t=418(external link)

Anuncios