strong hashing PHP senza sale

3

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.

    
posta Gras Double 15.11.2016 - 14:11
fonte

1 risposta

3

... attackers could steal the hashed data ... and use brute force to deduce back the private data.

Potrebbero esserci alcuni problemi pratici relativi alla quantità di entropia presente nei dati di input

$websiteDomain . $myChildSchool . $myPetName . $etc

Se alcune di queste informazioni sono note all'attaccante, quelle parti non hanno entropia. Le rimanenti parti sconosciute potrebbero essere brute-forzate dall'attaccante se i rimanenti bit di entropia diventano troppo bassi. Dovresti considerare:

  • Bit di entropia dei dati di input dopo l'utente malintenzionato ha acquisito il "frutto a basso impatto".
  • Quanto sono sensibili i restanti dati di input e quali sono i potenziali danni di questo indovinato?

The purpose is to be able to recover passwords ... using only my brain and an internet connetcion. I can't remember l33tpa$sw0rd more than one hour, though I can surely remember my parents' names and so on.

Si noti che ogni "domanda segreta" deve rispondere con precisione carattere per carattere in modo che l'hash risultante sia coerente. Aggiungi anche i bit di entropia per assicurarti che siano sufficienti.

Leggi questa descrizione dei vantaggi e svantaggi di ogni hash Slow Password popolare con le note di implementazione. Le opzioni migliori sono BCrypt, SCrypt e Argon2, con il primo che è il migliore e il secondo è il più recente sul mercato. Personalmente userò BCrypt per questo progetto.

I can't use password_hash() because the result is automatically salted so it produces different hashes each time. I can't manually provide a salt as it is deprecated (produces warning, and likely to be removed in future PHP versions).

Questa funzione utilizza BCrypt per impostazione predefinita, che è una delle buone opzioni. Ovviamente dovresti specificare un Salt codificato (immutabile) (che in questa situazione è considerato come Pepper), ed è meglio se puoi impostare un Fattore di lavoro personalizzato . StackOverflow sarebbe in grado di aiutarti con quei due requisiti specifici da implementare in PHP.

    
risposta data 15.11.2016 - 15:31
fonte

Leggi altre domande sui tag