L'applicazione richiede diversi input (in particolare, informazioni personali private) per produrre un hash fisso, ma non indovinabile.
Esempio semplificato:
$data = $websiteDomain . $myChildSchool . $myPetName . $etc;
for ($i = 0; $i < 1000000; ++$i) {
$data = hash('sha512', $data, true);
}
$data = str_replace(['/', '+', '='], '', base64_encode($data));
$result = substr($data, 0, $passwordLength);
L'obiettivo è creare un codice pubblicamente pubblicato, che genera hash che vengono poi utilizzati come password. E la parte importante: le password possono essere recuperate, usando il codice pubblico e le informazioni personali private.
Per questo motivo, non posso utilizzare password_hash()
perché il risultato è automaticamente salato in modo da produrre diversi hash ogni volta. Non posso fornire manualmente un salt in quanto deprecato (produce warning e probabilmente verrà rimosso in future versioni di PHP).
La mia preoccupazione principale è che alcune delle password potrebbero essere utilizzate su siti Web scadenti, che hanno restrizioni di lunghezza massima e memorizzano le password dell'utente come testo in chiaro. Pertanto, presumo che gli aggressori possano rubare i dati con hash dal sito Web e utilizzare la forza bruta per dedurre i dati privati.
Nell'esempio precedente sto usando SHA-512 con lo stretching delle chiavi. Sebbene, SHA non sia realmente progettato per questo, le GPU sono incredibilmente veloci su di esso e potrebbero esistere, ora o dopo, tecniche per aggirare tutte o parte delle iterazioni.
Quindi, quanto è accettabile la tecnica attuale? Potrebbe essere migliorato, e se sì, come? Idealmente, la soluzione non dovrebbe essere specifica per PHP e non dovrebbe richiedere librerie esterne.