algorithm - para - Algoritmos fonéticamente memorables de generación de contraseñas
generador de contraseñas de facebook (17)
Fondo
Mientras estaba en el gimnasio el otro día, estaba trabajando con mi cerradura de combinación, y me di cuenta de algo que me sería útil como programador. A saber, mi combinación es tres conjuntos separados de números que suenan igual o que tienen alguna otra relación que los hace fáciles de recordar. Por ejemplo, 5-15-25, 7-17-2, 6-24-5. Estos ejemplos parecen fáciles de recordar.
Pregunta
¿Cómo implementaría algo similar para las contraseñas? Sí, deberían ser difíciles de descifrar, pero también deberían ser fáciles de recordar para el usuario final. Las cerraduras combinadas hacen eso con una combinación de números que tienen sonidos similares, y con números que tienen propiedades similares (7-17-23: All Prime, 17 rollos de la lengua después de 7, y 23 es otro primo, y está (fuera de ese conjunto), el "difícil" de recordar).
Criterio
- La contraseña debe ser fácil de recordar.
Dog!Wolf
es fácil de recordar, pero una vez que un atacante sabe que su sitio web ofrece esa combinación, lo hace infinitamente más fácil de controlar. - Las palabras o letras deberían seguir principalmente los mismos sonidos (en su mayor parte).
- Al menos 8 letras
- No usar
!@#$%^&*();''{}_+<>?,./
Estos signos de puntuación, aunque son apropiados para contraseñas'' duras '', no tienen un sonido'' fácil de recordar ''.
Recursos
Esta pregunta es independiente del idioma, pero si hay una implementación específica para C #, me alegraría saber de ella.
Actualizar
Algunos usuarios han dicho que "esta es una contraseña incorrecta". No asuma que esto es para un sitio web. Esto podría ser solo para mí hacer una aplicación que genere contraseñas de acuerdo con estas reglas. Aquí hay un ejemplo.
Las letras A - C - C - L - I - M - O - P ''fluyen'', y resultan ser dos palabras regulares juntas ( Acclimate y Mop ). Además, cuando un usuario dice estas letras, o las dice como una palabra, es una palabra real para ellas. Fácil de recordar, pero difícil de descifrar (ataque del diccionario, obviamente).
Esta pregunta tiene un objetivo de dos partes:
- Construya contraseñas a partir de letras que suenen similares (usando aliteración) o
- Construir contraseñas que malla palabras comunes de manera similar para producir un tercer conjunto de letras que no está en un diccionario.
Algunas veces he usado un algoritmo siguiente:
- Pon todas las vocales minúsculas (de az) en una matriz Vocales
- Pon todas las consonantes en minúsculas (de az) en otra matriz Consonantes
- Cree una tercera matriz Pares de dos letras de forma que cree todos los pares de letras posibles entre Vocales y Consonantes ("ab", "ba", "ac", etc.)
- Seleccione al azar 3-5 elementos de pares y conéctelos juntos como cadena de contraseña
- Elija aleatoriamente
true
ofalse
- Si es
true
, elimine la última letra de la Contraseña - Si es
false
, no hagas nada
- Si es
- Sustituye 2-4 caracteres elegidos al azar en Contraseña con su equivalente en mayúscula
- Sustituye 2-4 caracteres elegidos al azar en Contraseña con un entero elegido al azar 0-9
Voilá: ahora debe tener una contraseña de longitud entre 5 y 10 caracteres, con caracteres alfanuméricos en mayúscula y minúscula. Tener vocales y consonantes se turnan con frecuencia para que sean semi-pronunciables y, por lo tanto, más fáciles de recordar.
Aquí está la parte 2 de su idea prototipada en un guión de shell. Toma 4, 5 y 6 palabras de letras (aproximadamente 50,000) del archivo de diccionario de Unix en su computadora, y concatenan esas palabras en el primer caracter.
#! /bin/bash
RANDOM=$$
WORDSFILE=./simple-words
DICTFILE=/usr/share/dict/words
grep -ve ''[^a-z]'' ${DICTFILE} | grep -Ee ''^.{4,6}$'' > ${WORDSFILE}
N_WORDS=$(wc -l < ${WORDSFILE})
for i in $(seq 1 20); do
password=""
while [ ! "${#password}" -ge 8 ] || grep -qe"^${password}$" ${DICTFILE}; do
while [ -z "${password}" ]; do
password="$(sed -ne "$(( (150 * $RANDOM) % $N_WORDS + 1))p" ${WORDSFILE})"
builtfrom="${password}"
done
word="$(sort -R ${WORDSFILE} | grep -m 1 -e "^..*${password:0:1}")"
builtfrom="${word} ${builtfrom}"
password="${word%${password:0:1}*}${password}"
done
echo "${password} (${builtfrom})"
done
Al igual que la mayoría de los generadores de contraseñas, hago trampa emitiéndolas en grupos de veinte. Esto a menudo se defiende en términos de "seguridad" (alguien que mira por encima del hombro), pero en realidad es solo un truco para que el usuario simplemente elija la contraseña más amigable.
Encontré las palabras de 4 a 6 letras del archivo de diccionario que todavía contienen palabras poco claras.
Una mejor fuente de palabras sería un documento escrito. Copié todas las palabras en esta página y las pegué en un documento de texto, y luego ejecuté el siguiente conjunto de comandos para obtener las palabras en inglés.
perl -pe ''s/[^a-z]+//n/gi'' ./624425.txt | tr A-Z a-z | sort -u > ./words
ispell -l ./words | grep -Fvf - ./words > ./simple-words
Luego utilicé estas 500 o más palabras muy simples de esta página para generar las siguientes contraseñas con el script de shell: el script muestra entre paréntesis las palabras que componen una contraseña.
backgroundied (background died)
soundecrazy (sounding decided crazy)
aboupper (about upper)
commusers (community users)
reprogrammer (replacing programmer)
alliterafter (alliteration after)
actualetter (actual letter)
statisticrhythm (statistical crazy rhythm)
othereplacing (other replacing)
enjumbling (enjoying jumbling)
feedbacombination (feedback combination)
rinstead (right instead)
unbelievabut (unbelievably but)
createdogso (created dogs so)
apphours (applications phrase hours)
chainsoftwas (chains software was)
compupper (computer upper)
withomepage (without homepage)
welcomputer (welcome computer)
choosome (choose some)
Algunos de los resultados allí son ganadores.
El prototipo muestra que probablemente se puede hacer, pero la inteligencia que necesita sobre aliteración o información silábica requiere una mejor fuente de datos que solo palabras. Necesitarías información de pronunciación. Además, he demostrado que probablemente desee una base de datos de buenas palabras simples para elegir, y no todas las palabras, para satisfacer mejor su requisito de contraseña memorable.
Generar una sola contraseña la primera vez y siempre, algo que necesita para la Web, tomará una mejor fuente de datos y más sofisticación. Usar un mejor lenguaje de programación que Bash con archivos de texto y usar una base de datos podría hacer que esto funcione instantáneamente. Utilizando un sistema de base de datos puede usar el algoritmo SOUNDEX, o algo así.
Buena idea. Buena suerte.
Cuando genere una contraseña para el usuario y la envíe por correo electrónico, lo primero que debe hacer cuando inicie sesión por primera vez es forzarla a cambiar su contraseña. Las contraseñas creadas por el sistema no necesitan ser fáciles de recordar porque solo deberían necesitarse una vez.
Tener contraseñas fáciles de recordar y difíciles de adivinar es un concepto útil para los usuarios, pero el sistema no debe hacer cumplir de alguna manera. Supongamos que envía una contraseña a la cuenta de gmail de su usuario y el usuario no la cambia después de iniciar sesión. Si la contraseña de la cuenta de Gmail se ve comprometida, la contraseña de su sistema se verá comprometida.
Por lo tanto, generar contraseñas fáciles de recordar para sus usuarios no es útil si tienen que cambiar la contraseña de inmediato. Y si no lo cambian de inmediato, usted tiene otros problemas.
Después de muchos años, he decidido usar la primera letra de las palabras en una frase de contraseña. Es imposible de descifrar, es versátil en cuanto a longitud y restricciones como "debes tener un dígito" y es difícil de cometer errores.
Esto funciona al crear una frase. ¡Un tema divertido y loco es útil! "Extranjeros de desbordamiento de pila aterrizaron sin usar cohetes o ruedas". Tome la primera letra, su contraseña es "soalwurow"
Puede escribir esto de forma rápida y precisa ya que no está recordando letra por letra, solo está diciendo una frase dentro de su cabeza.
También me gusta tener palabras alternativas desde el lado izquierdo y derecho del teclado, te da una velocidad de escritura fraccionalmente más rápida y un ritmo más agradable. Observe en mi ejemplo, sus manos se alternan izquierda-derecha-izquierda-derecha.
En primer lugar, asegúrese de que la contraseña sea larga. Considere usar una "frase de paso" en lugar de una sola "contraseña". Rompiendo frases de paso como "Perros y lobos se odian". es muy difícil pero son bastante fáciles de recordar.
Algunos sitios también pueden brindarle un consejo que puede ser útil, como Contraseñas seguras: Cómo crearlas y usarlas (enlazadas desde el Comprobador de contraseñas , que es una herramienta útil por sí mismo).
Además, en lugar de tratar de crear una contraseña fácil de recordar, en algunos casos una alternativa mucho mejor es evitar recordar la contraseña utilizando (y educando a los usuarios para usar) una buena utilidad de administración de contraseñas (consulte ¿Cuál es su almacenamiento de contraseña favorito? herramienta? ) - al hacer esto, la única parte que queda es crear una contraseña difícil de descifrar, que es fácil (cualquier oración aleatoria lo suficientemente larga).
Es posible que desee ver:
- El algoritmo de generación de contraseñas pronouncable utilizado por apg y explicado en FIPS-181
- Koremutake
Estoy completamente con rjh. La ventaja de usar las letras de inicio de una frase de acceso es que parece aleatoria, lo que hace que sea muy difícil de recordar si no conoce la frase detrás de ella, en caso de que Eve mire sobre su hombro mientras escribe la contraseña.
OTOH, si te ve escribir unos 8 caracteres, entre los que ''s'' dos, y luego ''o'' y ''r'', puede adivinarlo correctamente la primera vez.
Forzar el uso de al menos un dígito realmente no ayuda; simplemente sabes que será "pa55word" o "passw0rd".
Las letras de canciones son una fuente inagotable de frases de paso.
"But I should have known this right from the start"
se convierte en "bishktrfts". 10 letras, incluso solo minúsculas, le dan 10 ^ 15 combinaciones, lo cual es mucho , especialmente porque no hay atajos para descifrarlo. (Con 1 millón de combinaciones por segundo se necesitan 30 años para probar las 10 ^ 15 combinaciones).
Como extra (en caso de que Eve sepa que eres un fanático de la policía), podrías cambiar, por ejemplo, la segunda y la tercera letra, o tomar la segunda letra de la tercera palabra. Posibilidades infinitas.
FWIW Me gustan mucho las sílabas de palabras que se mezclan para obtener una contraseña fácil pero esencialmente aleatoria. Tome "Bongo" por ejemplo como una palabra al azar. Cambia las sílabas que obtienes "Gobong". Cambie las o por ceros en la parte superior (o alguna otra sustitución común) y obtendrá una secuencia de caracteres esencialmente aleatoria con algún rastro que lo ayude a recordarlo.
Ahora, cómo seleccionas las sílabas programáticamente: ¡esa es otra pregunta!
Las contraseñas generadas por el sistema son una mala idea para cualquier cosa que no sean cuentas de servicio interno o restablecimientos temporales (etc.).
Siempre debe usar sus propias "frases clave" que sean fáciles de recordar pero que sean casi imposibles de adivinar o fuerza bruta. Por ejemplo, la contraseña para mi antigua cuenta de la universidad era.
Here to study again!
Eso es 20 caracteres usando mayúsculas y minúsculas con puntuación. Esta es una contraseña increíblemente fuerte y no hay ningún software que pueda generar uno más seguro que sea más fácil de recordar para mí.
Me encantaría ver a alguien implementar contraseñas con caracteres de control como " <Ctrl>+N
" o incluso combo de caracteres como " A+C
" al mismo tiempo. Convertir esto a un equivalente binario sería, en mi humilde opinión, hacer que los requisitos de contraseña sean mucho más fáciles de recordar, más rápidos de escribir y más difíciles de descifrar (MUCHAS combinaciones más para verificar).
Me sorprende que nadie haya mencionado el algoritmo Multics descrito en http://www.multicians.org/thvv/gpw.html , que es similar al algoritmo FIPS pero se basa en trigrafos en lugar de dígrafos. Produce resultados como
ahmouryleg
thasylecta
tronicatic
terstabble
También porté el código para Python: http://pastebin.com/f6a10de7b
Mira la herramienta gpw . El paquete también está disponible en los repositorios Debian / Ubuntu.
Podría usar Markov Chains para generar palabras que suenen como inglés (o cualquier otro idioma que desee) pero no son palabras reales.
La cuestión de la facilidad para recordar es realmente subjetiva, así que no creo que puedas escribir un algoritmo como este que sea bueno para todos.
¿Y por qué utilizar contraseñas cortas en sitios web / aplicaciones informáticas en lugar de frases de paso? Son fáciles de recordar pero difíciles de descifrar.
Prefiero darles a los usuarios una contraseña "difícil", requiriéndoles que la cambien en el primer uso, y dándoles orientación sobre cómo construir una buena frase larga. También asociaría esto con los requisitos razonables de complejidad de la contraseña (más de 8 caracteres, combinación de mayúsculas / minúsculas y puntuación o dígitos). Mi razonamiento para esto es que es mucho más probable que las personas recuerden algo que eligen ellos mismos y es menos probable que lo anoten en algún lado si lo recuerdan.
Un giro en la idea de ''frase de paso'' es tomar una frase y escribir las primeras letras de cada palabra en la frase. P.ej
"A specter is haunting Europe - the specter of communism."
Se convierte
asihe-tsoc
Si la frase tiene punteos, como!,?, Etc., también podría empujarla allí. Lo mismo ocurre con los números, o simplemente sustituye las letras, o agrega números relevantes hasta el final. Por ejemplo, Karl Marx (quien dijo esta cita) murió en 1883, ¿por qué no ''asihe-tsoc83''?
Estoy seguro de que un ataque creativo de fuerza bruta podría capitalizar las propiedades estadísticas de esa contraseña, pero sigue siendo órdenes de magnitud más seguras que un ataque de diccionario.
Otro gran enfoque es simplemente inventar palabras ridículas, por ejemplo, ''Barangamop''. Después de usarlo algunas veces lo memorizará, pero es difícil usar la fuerza bruta. Agregue algunos números o signos de puntuación para mayor seguridad, por ejemplo, ''386Barangamop!''
Una forma de generar contraseñas que ''suenan como'' palabras sería usar una cadena de markov. Una cadena de markov de n grados es básicamente un gran conjunto de n-tuplas que aparecen en tu corpus de entrada, junto con su frecuencia. Por ejemplo, "aardvark", con una cadena de markov de segundo grado, generaría las tuplas (a, a, 1), (a, r, 2), (r, d, 1), (d, v, 1) , (v, a, 1), (r, k, 1). Opcionalmente, también puede incluir tokens ''virtuales'' de palabra de inicio y palabra final.
Para crear una cadena de markov útil para sus propósitos, debería incluir un gran corpus de datos en inglés, hay muchos disponibles, incluido, por ejemplo, Project Gutenburg, para generar un conjunto de registros como se describe anteriormente. Para generar palabras o frases en el lenguaje natural que al menos en su mayoría siguen las reglas de la gramática o la composición, una cadena de markov de 3er grado es generalmente suficiente.
Luego, para generar una contraseña, eliges una tupla aleatoria de "inicio" del conjunto, ponderada por su frecuencia y la salida de la primera letra. Luego, seleccione repetidamente aleatoriamente (una vez más ponderada por frecuencia) una ''siguiente'' tupla, es decir, una que comience con las mismas letras con las que termina su actual, y tiene una sola letra diferente. Utilizando el ejemplo anterior, supongamos que empiezo en (a, a, 1) y saco ''a''. Mi única opción siguiente es (a, r, 2), así que saqué otra ''a''. Ahora puedo elegir entre (r, d, 1) o (r, k, 1), así que elijo uno al azar en función de su frecuencia de ocurrencia. Supongamos que selecciono (r, k, 1) - Salgo ''r''. Este proceso continúa hasta llegar a un marcador de fin de palabra, o decide detenerse independientemente (ya que la mayoría de las cadenas de Markov forman un gráfico cíclico, es posible que nunca termine de generar si no aplica una limitación de longitud artificial).
A nivel de palabra (p. Ej., Cada elemento de la tupla es una palabra), algunos "bots de conversación" utilizan esta técnica para generar oraciones sin sentido que parecen sensatas. También lo utilizan los spammers para tratar de evadir los filtros de spam. A nivel de carta, como se describe anteriormente, se puede usar para generar palabras sin sentido, en este caso para contraseñas.
Una desventaja: si su corpus de entrada no contiene más que letras, ni sus frases de salida, por lo que no pasarán la mayoría de los requisitos de contraseña ''segura''. Es posible que desee aplicar algunos postprocesamiento para sustituir algunos caracteres por números o símbolos.
editar: Después de responder, me di cuenta de que esto de ninguna manera es fonéticamente memorable. Dejando la respuesta de todos modos b / c me parece interesante. /editar
Viejo hilo, lo sé ... pero vale la pena intentarlo.
1) Probablemente construiría el diccionario más grande que puedas ammass. Organícelos en cubos por parte del discurso.
2) Luego, construye una gramática que pueda hacer varios tipos de oraciones. El "tipo" de oración se determina mediante permutaciones de partes de la oración.
3) Aleatoriamente (o tan cerca del azar como sea posible), elija un tipo de oración. Lo que se devuelve es un patrón con marcadores de posición para partes del discurso (nvn sería sustantivo-verbo-sustantivo)
3) Elija palabras al azar en cada parte del balde de expresión para sustituir a los marcadores de posición. Llénalos. (El ejemplo anterior podría convertirse en algo así como car-ate-bicycle.)
4) escanea aleatoriamente a cada personaje decidiendo si deseas o no reemplazarlo con un personaje que suena de manera similar (o un conjunto de caracteres), o un parecido. Este es el paso más difícil del problema.
5) la contraseña resultante sería algo así como kaR @ tebyCICle
6) reírse de los resultados humorísticos como el anterior que se parece a "la bicicleta de karate"