La password hash è sicura se sale e chiave sono memorizzati con l'hash

-1

Sto provando ad hash la password usando SHA256 con la chiave casuale salt e random in php e memorizzando il valore hash indietro con salt e la chiave usata. Voglio sapere se questo fornisce una sicurezza adeguata?

Quanto segue è il codice:

function hashpwd($string, $salt, $KEY)
{
    if(strcmp($KEY, '')==0)
        $KEY=openssl_random_pseudo_bytes(32); //key used for encryption and decryption
    if(strcmp($salt, '')==0)
    {
        $salt= openssl_random_pseudo_bytes(32);
    }
    $string = $salt.$string;
    $pwd = hash_hmac("SHA256", $string, $KEY);
    //echo "$salt".$pwd."<br>";
    return base64_encode($salt).base64_encode($KEY).$pwd;
}

Devo usare il doppio sale?

Nota: l'esecuzione su PC non è sicura di offrire più iterazioni di hashing.

EDIT:

Ho cambiato il codice in seguito, usato password_hash () con BCRYPT e 5000 round:

function hashpwd($password)
{
        $salt='';
        $strong = FALSE;
        while (!$strong){
            $salt = openssl_random_pseudo_bytes(32,$strong);
        }
        $pwd = rtrim(password_hash($password, PASSWORD_BCRYPT, array('rounds'=> 5000, 'salt'=> $salt)));
        return $pwd;
}

Il codice sopra è abbastanza buono?

Non sto mettendo in dubbio la sicurezza di BCRYPT, la mia domanda era sapere quale dei due codici era meglio usare.

    
posta Abhishek V 19.06.2015 - 07:21
fonte

1 risposta

2

Puoi sicuramente usare più iterazioni di hash; Posso usare migliaia o centinaia di migliaia di iterazioni anche sul mio smartphone!

In particolare per PHP, guarda le funzioni password_hash () e password_verify (), secondo la password di PHP.net Domande frequenti sull'hashing . Usa la modalità PASSWORD_BCRYPT e imposta il costo che l'hardware è in grado di gestire e fornisci comunque i tempi di risposta che l'utente è disposto ad accettare: solitamente puoi utilizzare una frazione ragionevole di secondo, poiché l'hashing della buona password è a thread singolo.

Leggi la risposta canonica di Thomas Pornin su Come hash password sicure? prima di provare qualsiasi hashing della password. Per riassumere:

  • Non utilizzare mai un singolo passaggio di alcun algoritmo di hashing.
  • Non tira mai il tuo, che è ciò che è il tuo esempio 2 (e anche l'esempio 1, se + significa concatenazione).
  • Nome utente memorizzato in chiaro
  • Salt generato per utente, 8-16 byte casuali, memorizzati in chiaro
    • in puro binario o codificati in Base64 o hex o qualunque cosa ti piaccia.
  • Usa BCrypt, SCrypt o PBKDF2
  • Utilizza un conteggio del fattore di lavoro / costo / iterazione più alto di quello che la tua CPU può gestire durante i periodi di picco futuri previsti.
  • In particolare per PBKDF2, non chiedere più byte di output binari di quanto non produca l'hash nativo. Direi non meno di 20 byte binari, indipendentemente.
    • SHA-1: output = 20 byte (40 cifre esadecimali)
    • SHA-224: 20 byte < = output < = 28 byte (56 cifre esadecimali)
    • SHA-256: 20 byte < = output < = 32 byte (64 cifre esadecimali)
    • SHA-384: 20 byte < = output < = 48 byte (96 cifre esadecimali)
    • SHA-512: 20 byte < = output < = 64 byte (128 cifre esadecimali)
  • Per il PBKDF2 in particolare, SHA-384 e SHA-512 hanno un vantaggio comparativo sui sistemi a 64 bit per il momento, poiché i molti attaccanti della GPU vintage 2014 avranno un margine di vantaggio minore per le operazioni a 64 bit sulla difensiva CPU rispetto a quanto farebbero con le operazioni a 32 bit.
risposta data 19.06.2015 - 08:31
fonte

Leggi altre domande sui tag