Archiviazione sicura di password tramite PHP5

4

Nota di partenza: Dopo aver esaminato alcuni articoli e risposte pubblicati su SO relativi alla memorizzazione di password protette, non sono ancora sicuro se il mio modo di pensare sia applicabile alla realtà di oggi.

Attualmente sto pensando a un modo per fornire una struttura sicura per l'archiviazione e il recupero delle password necessarie per l'autenticazione di un utente su una pagina web. Durante la navigazione in rete e scavare attraverso le pagine di risposte mi sono trovato bloccato a un certo punto. Prima di tutto, il tempo passa e non tutti gli articoli / risposte sono aggiornati. In secondo luogo, ci sono molte ambiguità su ciò che dovrebbe essere effettivamente fatto.

Sto usando il database PHP5 e Postgres. Pur essendo consapevole dell'esistenza del modulo pg_crypto mi sembra che fare quei calcoli a livello di database non sembri sicuro a causa del logging e passando semplicemente la password alla query del database.

Quindi ho deciso di portare a termine il lavoro nel codice dell'applicazione (PHP). Dal momento che PHP5 esiste un'API di hashing della password nativa che fornisce funzioni come password_hash() e password_verify() .

Quello che sto chiedendo è un consiglio se sono o no sulla strada giusta o su eventuali miglioramenti che potrebbero essere supportati da forti argomenti relativi alla sicurezza (si prega di astenersi dal consigliare sull'iterazione di milion volte). Inoltre, è possibile utilizzare PHP5 o mi manca anche qualche conoscenza teorica (considerando il mio modo di pensare per questo processo).

Il mio modo di pensare per questo processo è:

  1. Ottieni la password dall'utente
  2. Applicare un sale generato casualmente per ciascun utente (preferibilmente una lunghezza costante per ogni sale), ovvero indipendente da qualsiasi dato memorizzato nel database
  3. Memorizza quel sale nella tabella in cui gli utenti e le loro password con hash saranno
  4. "Hashinng"
    • Hash il sale concatenato con password usando l'algoritmo SHA512
    • password_hash con bcrypt
  5. Store hash in db

Quindi come puoi vedere la mia considerazione principale è se usare SHA-512 o bcrypto, ma sento che mi manca la capacità in questo campo e quindi sto chiedendo consigli generali a il mio intero processo .

In particolare, la mia attenzione su quale processo di "hashing" è stato portato dalla risposta di erickson sul confronto tra SHA e Bcrypt . Sono a conoscenza dell'esistenza di SHA3, ma ciò non dimostra che c'erano cose che dovrebbero essere migliorate rispetto alla famiglia SHA2 (questa è una domanda di tipo per ora)?

Quello che ho già letto:

Sale non casuale per gli hash delle password

SHA512 vs. Blowfish e Bcrypt

Secure hash e salt per le password PHP

Archiviazione password, hash () con sha-512 o crypt () con blowfish (bcrypt)?

Manuale di riferimento PHP - FAQ - Password

    
posta Kamil Gosciminski 15.04.2015 - 14:55
fonte

1 risposta

4

Penso che molte delle tue domande (es. SHA-512 vs bcrypt) abbiano una risposta nella guida collegata a da AviD. Ma in realtà non dice nulla su PHP, quindi risponderò a quella parte.

Hashing una password in PHP5

È positivo che tu voglia capire i concetti sottostanti, ma in realtà l'hashing sicuro di una password in PHP5 è abbastanza semplice:

$hashedPassword = password_hash($plainPassword, PASSWORD_DEFAULT);

Ecco fatto . Memorizzalo nel database, usa password_verify per confrontare e il gioco è fatto. password_hash creerà per te un valore per utente, quindi non è necessario il passaggio 2 o 3 [*]. Inoltre, non è necessaria la prima parte del passaggio 4 (è sufficiente un hash una sola volta).

Il risultato di questo sarà nella forma $hashFunctionId$options$saltHash . HashFunctionId e options (il costo) vengono utilizzati per memorizzare informazioni su come è stato creato l'hash.

[*] Posso capire perché è confuso, perché così tante guide menzionano esplicitamente l'importanza dei sali per utente, quindi potrebbe sembrare strano che PHP funzioni effettivamente per te

opzioni password_hash

Quindi a cosa servono le altre opzioni di password_hash se l'hashing è così semplice?

PASSWORD_DEFAULT significa che al momento verrà utilizzato bcrypt, ma se in futuro ci saranno metodi migliori, questi verranno utilizzati. Se per qualche motivo vuoi controllarlo, sostituiscilo con PASSWORD_BCRYPT .

Puoi passare un sale che sostituisce l'auto-generazione di un sale. Questo è utile se vuoi ottenere lo stesso risultato quando esegui l'hashing della stessa password, o se vuoi includere un pepe.

E puoi sostenere un costo, se pensi che il costo predefinito di 10 non sia sufficiente per te.

    
risposta data 15.04.2015 - 15:57
fonte

Leggi altre domande sui tag