Una costruzione come hash(site_name + pw)
genererà una password sicura fintanto che la password è alta entropia e l'hash ha bit sufficienti (ad esempio, 128+ bit che avrà il tuo hash crittografico standard, ma non usare hash non crittografici come crc32). Se utilizzi qualcosa come pw = password123
facilmente intuibile, un hacker sofisticato potrebbe essere in grado di capire il tuo schema dal vedere la tua password in un sito che controllano e quindi forzare la tua password per tutti gli altri siti (ad es. password per esempio.com è md5("examplepassword123")
potrebbe essere possibile invertire testando le password del modulo md5(site_name + pw)
- puoi generare miliardi di hash md5 al secondo per computer: è una cattiva idea affidarsi a un utente malintenzionato che non conosce lo schema di generazione della password, invece dovresti fare affidamento sulle tue password effettive con alta casualità intrinseca (vedi Principio di Kerckhoffs ).
Tuttavia, se usi qualcosa come bcrypt, starai bene con una password debole dato che bcrypt crea un sale casuale a 128 bit che fornisce più di sufficiente entropia per impedire che anche la password più debole sia ragionevole (supponendo che il sale sia usato differisce tra i tuoi hash). Tieni presente che dovrai memorizzare questo salt in modo casuale per poter effettuare nuovamente il login, quindi a questo punto probabilmente sarebbe stato più semplice utilizzare una password generata in modo casuale per ogni sito web che visiti.
Per fare un esempio con bcrypt usando python (nell'interprete ipython):
In [1]: import bcrypt
In [2]: bcrypt.hashpw('amazonpassword123', bcrypt.gensalt(10))
Out[2]: '$2b$10$//rLpdWc/0hljdOf90366u1uaRch7q59AxF0qcodHvDckO1nd..ky'
In [3]: bcrypt.hashpw('amazonpassword123', bcrypt.gensalt(10))
Out[3]: '$2b$10$eUsCtvQ9mvYA2qAEShaqjOqgYogRP4mohEag5bm3Hls10JPSQxU4y'
In [4]: bcrypt.hashpw('amazonpassword123', Out[2])
Out[4]: '$2b$10$//rLpdWc/0hljdOf90366u1uaRch7q59AxF0qcodHvDckO1nd..ky'
Si noti che l'hashing della stessa cosa due volte con bcrypt genera un hash completamente diverso poiché utilizzavano due diversi sali creati casualmente (con 2 ^ 10 cicli di hashing); questo è il motivo per cui Out[2] != Out[3]
. Questo non è problematico quando si controllano le password con un hash bcrypt (dato che l'hash contiene il salt), quindi è sufficiente fornire l'hash memorizzato nel database da utilizzare come salt e quindi verificare che corrisponda all'hash memorizzato; questo è il motivo per cui Out[2] == Out[4]
.
L'altro problema di cui preoccuparsi è che i siti interrompono silenziosamente la tua password. Usando dire un hash di bcrypt completo, in cui i primi sette caratteri sono $2b$<lg(number of rounds)>$
potrebbe indebolire gravemente la tua password. Ad esempio, una VPN fornita da un noto fornitore che utilizzo per lavoro tronca la mia password utente a 8 caratteri (sebbene mi permetta di digitare password molto più lunghe - controlla solo i primi 8).