Il numero di tentativi è
simboli ^ lunghezza
(elevazione a potenza, operatore
**
in python). Il tempo per effettuare un tentativo dipende dall'hardware (principalmente dalle gpu) e dal software (funzioni di hash), ma è una costante che puoi stimare per difetto (per rappresentare un hardware molto buono). In crittografia generalmente si parla di tempo medio, quindi devi dividere per 2 il risultato che otterrai.
Facciamo un esempio:
- è formata da a-z, A-Z, 0-9 (26 + 26 + 10 = 62 simboli);
- è lunga 6 simboli;
- quindi abbiamo 62^6 = 56800235584 possibili password;
- dobbiamo provarne più della metà (56800235584 / 2 = 28400117792) per iniziare ad avere una probabilità favorevole (più del 50%) di trovare quella della nostra vittima;
- tra hardware e software, abbiamo fatto un benchmark che ci dice che siamo in grado di calcolare circa 1 milione di password al secondo;
- il tempo (medio) per trovare la password della nostra vittima è di 28400117792 / 1000000 = 28400 secondi = 8 ore;
- se al posto essere lunga 6 simboli fosse lunga 7 il tempo necessario sarebbe di circa 20 giorni, se fosse lunga 8 il tempo sale a 3 anni e mezzo.
Adesso è chiaro che 1 milione di password al secondo è un numero totalmente inventato, ma vediamo cosa succede se prendo un hardware 100 volte migliore (100 milioni di password al secondo):
- 6 caratteri richiedono 5 secondi;
- 7 caratteri richiedono 5 ore;
- 8 caratteri richiedono 12 giorni;
- 9 caratteri sono 2 anni.
Quindi un errore grossolano mi porta a consigliarti una password 1 carattere più corto: dal punto di vista dell'utente non fa tutta sta grossa differenza visto non gli stiamo consigliando di mettere password lunghissime, gli stiamo consigliando di aggiungere un altro carattere. Se avessimo più di 62 possibili caratteri, l'impatto dell'hardware e del software sarebbe ancora meno rilevante.
Se vuoi un'idea, diciamo stimare la velocità di un computer con 1 milione di password al secondo (come ho fatto primo esempio) può essere accettabile. Visto che stai scrivendo un programmino, magari segnala la scelta di default all'utente e permettigli di inserire un numero a suo piacimento.
È irrilevante avere i numeri precisi, all'utente non frega niente se al posto di 3 anni sono 3 anni, 21 giorni, 14 ore, 54 minuti e 13 secondi. Quello che importa è capire il salto temporale che ottieni complicando la tua password: intuire l'importanza di utilizzare numeri, maiuscole e minuscole, capire se è meglio allungare la password o piuttosto che scambiare un carattere con un simbolo e cose di questo tipo.
Segnala anche che i tempi che riporterai sono quelli di
password random (e.g., quelle generate dal tuo programma). Il tempo per crackare
Password1 è di 1 nanosecondo, non di 210 anni come il tuo programma suggerirebbe.