Le chiavi di crittografia sono in genere valori a lunghezza fissa. Sfortunatamente, gli umani non possono ricordare lunghe stringhe di numeri, quindi usiamo invece le password.
Ad esempio, questa potrebbe essere la tua chiave a 256-bit:
d4f6d068b4e8c4e924ce9b28585a6009672e56d61215e7d9251b5d36283edd5d
Non è troppo facile da ricordare, vero?
Tuttavia, quanto sopra è stato generato calcolando un hash crittografico (in questo caso SHA256 ) della parola "waffles", che è molto più facile da ricordare. Una funzione di hash prende un input di lunghezza arbitraria e calcola un output di lunghezza fissa.
In realtà, abbiamo bisogno di funzioni di derivazione chiave (KDF) per avere proprietà speciali. Una proprietà desiderabile è che dovrebbe essere computazionalmente non fattibile per calcolare m
da h
, dove h = KDF(m)
, cioè è difficile calcolare l'input della funzione se si conosce solo l'output. Un'altra proprietà desiderabile è che la funzione è abbastanza dispendiosa dal punto di vista computazionale (lenta) per rendere impossibile il calcolo di milioni di chiavi, senza compromettere le prestazioni per usi legittimi. Pertanto, schemi KDF speciali come PBKDF2 e bcrypt vengono solitamente utilizzati per calcolare queste chiavi crittografiche da password facilmente memorizzabili.
L'unico modo pratico per rompere una chiave generata da una funzione di derivazione chiave ideale è quella di indovinare le password probabili. Se la tua password è "password", è probabile che sia rotta. Se la tua password è una stringa di 20 lettere e numeri casuali, è molto meno probabile che sia indovinata.
Per rispondere alla domanda che chiedi alla fine:
If the password is "pass", what's the resulting key?
Questa non è davvero una domanda che ha molto senso. Il risultato potrebbe essere qualsiasi cosa. Ci sono molte diverse funzioni hash (MD5, SHA1, SHA256, SHA512, Whirlpool, RIPEMD160, ecc.) E molte diverse funzioni di derivazione chiave (PBKDF2, bcrypt, scrypt), che possono utilizzare i sali o HMAC . Le possibilità sono infinite!