Solución:
(¿Tiene evidencia de que las contraseñas aleatorias sean generalmente ¿maleficio?)
Estas son algunas de las posibles razones por las que encuentra con frecuencia contraseñas hexadecimales:
-
Es posible que las contraseñas que veas ya estén codificadas. Dado que las funciones hash devuelven cadenas binarias, a menudo las verá almacenadas en forma hexadecimal.
-
Hash de una secuencia binaria aleatoria (por ejemplo, de
/dev/urandom
) es una forma barata pero razonablemente segura de crear una contraseña aleatoria. De vez en cuando verá algo como esto en la naturaleza:$ head -c 100 /dev/urandom | sha256sum | head -c 25 c9ea6b67af36753a68ef42429
-
Todos los personajes son fáciles de distinguir. Es decir, no tendrá problemas al confundir
1
yI
,O
y0
, etc., si solo permite hexadecimales en primer lugar. -
Las secuencias generadas aleatoriamente suelen ser binarias, por lo que mostrarlas en forma hexadecimal parece lógico y eficiente.
Dicho esto, elegir una contraseña aleatoria de un rango mayor que [0-9a-f]
es obviamente más seguro si no ajusta la longitud. Suelo ir con tu sugerencia de [0-9a-zA-Z]
lo que me brinda una amplia gama y evita los caracteres especiales que podrían causar problemas con el almacenamiento y la transmisión.
Además, esto es lo que puse en mi configuración de shell para generar rápidamente contraseñas en Linux:
function spw() { cat /dev/urandom | tr -dc a-zA-Z0-9 | head -c ${1:-20} }
P.ej, spw 25
me dará una contraseña de 25 caracteres de [0-9a-zA-Z]
.
Arminius mencionó la simplicidad del hechizo, y creo que eso es algo que vale la pena expandir.
Los generadores de números aleatorios generalmente funcionan con bits, por lo que el rango de números que pueden generar es una potencia de dos. Una variedad de personajes como [0-9a-zA-Z]
tiene 62 caracteres, que es dos menos que una potencia de dos (64), por lo que la computadora tiene que hacer alguna conversión entre los rangos.
Eso se puede hacer, pero es fácil equivocarse. La forma “estándar” es tomar el número real, dividirlo por el rango que desee y tomar el resto como su número aleatorio. Sin embargo, eso introduce sesgos. Para un ejemplo simple, digamos que genera números en [0-3]
pero los quieres en [0-2]
en lugar de. los [0-3]
el rango se correlacionaría con el [0-2]
rango así:
0 => 0 mod 3 => 0
1 => 1 mod 3 => 1
2 => 2 mod 3 => 2
3 => 3 mod 3 => 0
Tenga en cuenta cómo puede obtener un 0
de dos formas diferentes: 0
y 3
ambos van a 0
. El enfoque está sesgado a generar 0
s, lo que hará que su contraseña sea más fácil de adivinar.
los correcto La forma implica calcular el relleno correcto para que lo que generó se ajuste uniformemente al rango, lo cual es complicado y podría hacer que su contraseña sea mucho más larga dependiendo de cómo se compare su rango de salida con el del generador de números aleatorios.
Un enfoque más fácil es simplemente usar un rango que ya sea una potencia de dos para que pueda ignorar el sesgo por completo. La mayoría tiene problemas.
- Base-2 (binario) produce cadenas extremadamente largas.
- Base-4 (cuaternario) no es mucho mejor.
- Base-8 (octal) es mejor pero aún más largo.
- Base-16 (hexadecimal) es un poco larga, pero razonable. También codifica 4 bits por carácter, lo cual es bastante conveniente cuando las computadoras prefieren múltiplos de 8.
- Base-32 codifica 5 bits por carácter, que es no conveniente cuando las computadoras prefieren múltiplos de 8.
- Base-64 codifica 6 bits por carácter, lo que todavía es incómodo (pero un poco menos, ya que al menos es un número par).
- Base-96 es popular, pero no tiene una potencia de 2, por lo que tiene el mismo problema que
[0-9a-zA-Z]
. - Base-128 y sobre todo involucran símbolos que no se pueden escribir fácilmente en un teclado querty típico.
Para expandir un poco por qué base-64 es un problema, considere lo que sucede cuando intenta codificar un solo byte (8 bits). No puede hacerlo con un solo carácter base 64, ya que solo obtiene 6 de los 8 bits. Pero si usa dos caracteres, debe averiguar cómo rellenar su byte de 8 bits en una salida de 12 bits sin introducir sesgos o sugerir que podría haber un byte adicional.
Hex, por el contrario, es casi trivial para codificar bytes. Simplemente busque cada byte en una tabla de 256 elementos para obtener dos caracteres y escupirlos. Proporciona contraseñas razonablemente cortas, no usa símbolos extraños y es fácil de implementar. Es la mejor opción para los generadores de contraseñas conscientes de la seguridad.
Quizás lo mejor de todo es que la mayoría de los lenguajes de programación admiten hexadecimal desde el primer momento. La biblioteca C tiene printf()
, que puede formatear como octal, decimal o hexadecimal. Asimismo, C ++ tiene manipuladores de E / S que utilizan los mismos formatos. Sin embargo, no hay soporte incorporado para otras bases (ni siquiera base-64), por lo que debe hacerlo usted mismo (complicado) o encontrar una biblioteca que lo haga bien (violando la regla NIH (y también posiblemente mucho trabajo para verificarlo)). Es mucho más fácil usar lo que está en la biblioteca estándar, especialmente cuando funciona.
Es cierto que obtienes menos seguridad por carácter con hexadecimal que con otras codificaciones, pero como Eric Lagergren señaló amablemente en los comentarios, hex(random_bytes)
es exactamente tan seguro como random_bytes
. Es más largo, eso es todo. De hecho, todo lo que necesita son 16 bytes (codificados como 32 dígitos hexadecimales) para tener una contraseña tan segura que cualquier atacante quemará toda la energía del sistema solar antes de tener una mínima posibilidad de adivinarla. La mayoría de los sitios web aceptarán felizmente contraseñas de 32 caracteres, por lo que no hay problemas para usarlas.
Visión general
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.
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. Cabe señalar que 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.
Con eso en mente, pasemos a POR QUÉ solo viste a-f
y no a-z
.
Conjuntos de símbolos
La razón por la que viste a-f
en lugar de a-z
, se debe principalmente a su conjunto de símbolos. Por ejemplo:
Hexadecimal Numerals: (0-9, A-F) (e.g. WEP Key)
Como puede ver, se puede crear para un WEP Key
utilizando Hexadecimal Numerals
Conjunto de símbolos. Si quieres algo como (az, AZ, 0-9), te sugiero que Case Sensitive Alphanumeric
Conjunto de símbolos que es más complejo que un conjunto de símbolos hexadecimales.
Recursos
Puede leer más sobre contraseñas generadas y conjuntos de símbolos con el enlace a continuación:
¡Soy el enlace de abajo!
Esperamos que esto te ayude a resolver tu problema.