Asignar de forma segura una cadena aleatoria a un conjunto de caracteres personalizado

0

Estoy escribiendo un script de Python para generar contraseñas personalizadas basadas en un HMAC. Quiero que las contraseñas sean compatibles con los requisitos de varios sitios web, así que quiero asignar la salida HMAC (por ejemplo, formato hexadecimal) a una matriz de caracteres permitidos.

Digamos que quiero asignar 'fea503e5' solo a números.

El problema es hacerlo de forma segura, como usar módulo:

# numbers = "0123456789"
# pwd = ""
# ascii_digest is [65, 66, 67] for string "abc"
for i in ascii_digest:
    pwd = pwd + numbers[i % len(chars)]

no es seguro porque algunas letras tienen más posibilidades de ser seleccionadas (múltiplos de 10).

¿El programa tr hará esto de forma segura? Además, ¿cómo funciona o más aún, cómo se debe implementar una función de mapeo segura?

    
pregunta Irving Poe 08.10.2014 - 17:14
fuente

1 respuesta

1

Puedes [65, 66, 67] convertir a 656667. Ya que puedes volver a calcularlo, sería del mismo nivel de seguridad. Sin embargo, supongo que esto no es lo que realmente quieres. Supongo que quieres el resultado con la menor cantidad de letras / dígitos posible.

Considere la contraseña como un número n-base donde n es el número de caracteres posibles en la contraseña. Lo que realmente desea es convertir el número n base (contraseña) en el número m base donde m es el número de caracteres en el conjunto de destino. Es fácil si solo tiene números pequeños que se pueden mantener en el valor entero. Sin embargo, es más difícil con números más grandes, solo necesitarías una aritmética de escuela intermedia.

Por ejemplo, tenemos 26 letras a..z. bcd = [1, 2, 3] sería un número de 26 bases (la letra a es 0). Puedes convertirlo a entero fácilmente:

n = 1 + 26 * 2 + 26 ^ 2 * 3

BASE = 26
res = 0
k = 1
for n in abc:
    res += n*k
    k *= BASE
return res

Es como 1234 = 1 * 10 ^ 3 + 2 * 10 ^ 2 + 3 * 10 ^ 1 + 4 ^ 10 ^ 0 solo 10 sería 26 :-)

Luego, puedes convertirlo a un número de 10 bases (o la base que sea):

BASE = 10
while(n):
   out.append(n % BASE)
   n=n/BASE
return n

Como mencioné, el problema podría ser un gran número. Puedes implementarlo por ti mismo y no es tan difícil como parece, solo usa el algoritmo de división de base que aprendiste en tu escuela intermedia o incluso antes, o puedes intentar encontrar alguna biblioteca de Python de número grande que sea aún más fácil.

    
respondido por el smrt28 08.10.2014 - 18:47
fuente

Lea otras preguntas en las etiquetas