Mappatura sicura di una stringa casuale a un set di caratteri personalizzato

0

Sto scrivendo uno script Python per generare password personalizzate basate su un HMAC. Voglio che le password supportino i vari requisiti dei siti Web, quindi voglio mappare l'output HMAC (es .: formato hex) a un array di caratteri consentiti.

Diciamo che voglio mappare 'fea503e5' solo ai numeri.

Il problema lo sta facendo in modo sicuro, come usando modulo:

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

non è sicuro perché alcune lettere hanno più possibilità di essere prelevate (multipli di 10).

Il programma tr farà questo in modo sicuro? Come funziona o anche di più, come deve essere implementata una funzione di mappatura sicura?

    
posta Irving Poe 08.10.2014 - 17:14
fonte

1 risposta

1

È possibile [65, 66, 67] convertire in 656667. Poiché è possibile ricalcolarlo, sarebbe dello stesso livello di sicurezza. Tuttavia, suppongo che questo non è ciò che vuoi veramente. Immagino che tu voglia il risultato con il minor numero possibile di lettere / cifre.

Considera la password come un numero n-base dove n è il numero di possibili caratteri nella password. Quello che vuoi veramente è convertire il numero n-base (password) nel numero m-base dove m è il numero di caratteri nel set di destinazione. È facile se hai solo numeri piccoli che possono essere contenuti nel valore intero. È più difficile con numeri più grandi, tuttavia, è necessario solo un aritmetica della scuola media.

Ad esempio, abbiamo 26 lettere a..z. bcd = [1, 2, 3] sarebbe il numero 26-base (la lettera a è 0). Puoi convertirlo in intero facilmente:

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

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

È come 1234 = 1 * 10 ^ 3 + 2 * 10 ^ 2 + 3 * 10 ^ 1 + 4 ^ 10 ^ 0 solo 10 sarebbe 26 :-)

Quindi, puoi convertirlo in 10-base (o qualunque base) numero:

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

Come ho detto, il problema potrebbe essere un numero elevato. Puoi implementarlo da solo e non è così difficile come sembra, basta usare l'algoritmo di divisione di base che hai appreso sulla tua scuola media o anche prima, oppure puoi provare a trovare una libreria Python di grande numero che sarebbe ancora più facile.

    
risposta data 08.10.2014 - 18:47
fonte

Leggi altre domande sui tag