C'è qualche problema nell'usare la funzione crypt () di PHP con un addizionale salt?

1

Il mio script di autenticazione PHP è sicuro? Ho notato che gli hash iniziano con le prime due lettere del nome utente. Potrebbe esserci un difetto di sicurezza usando crypt () in questo modo?

<?php

// Credentials :
// admin / P4ssW0rd
// j.doe / r0x0r

$cred = array(
    'admin' => 'adkFV/7Pa.Em.',
    'j.doe' => 'j.4AzOhv10e1M'
);

$salt = 'abcdefg';
$user = $_POST['login'];
$pass = $_POST['pass'];

if (isset($cred[$user]) && crypt($salt . $pass, $user) == $cred[$user]) {
    echo 'Access granted';
} else {
    echo 'Access denied';
}
    
posta user46381 11.05.2014 - 14:57
fonte

2 risposte

4

Il tuo script è atroce in diversi modi:

  • Come sottolineato da @Corneliux, la funzione crypt () di PHP di PHP usa la vecchia funzione crypt() basata su DES dal mondo Unix (precisamente, ciò che è stato usato in Unix 20 anni fa). Utilizzerà solo le prime 8 lettere della password fornita, ignorando il resto. Nel tuo caso, le prime 7 lettere sono il contenuto della tua variabile $salt , non della password. Ciò significa, in pratica, che a un utente verrà concesso l'accesso come amministratore, a condizione che ciò che inserisce come password inizi con una "P".

  • Anche se crypt() ha utilizzato una discreta hashing della password funzione , lo utilizzeresti comunque male. Nella funzione crypt() di PHP, si suppone di fornire il sale come secondo parametro; non incollarlo con la password; in questo momento, usi il nome utente come salt.

  • La tua variabile $salt non è comunque un sale. Il punto di un sale è quello di cambiare ; idealmente, ogni istanza di hashing della password dovrebbe avere il proprio valore di sale (ovvero, un nuovo salt per ogni utente e un nuovo salt ogni volta che un utente cambia la sua password). Un valore salato hardcoded, sempre uguale per tutti, è l'esatto opposto di quello che dovrebbe essere un sale.

  • Scrivere le semplici password degli utenti nei commenti è, diciamo, imprudente.

Fatti un favore: usa un PHP abbastanza recente (almeno 5.5.0) e chiama password_hash () . Quella chiamata utilizzerà bcrypt , il che è il più soddisfacente possibile. Non giocherellare con i sali: lascia che la funzione generi un sale casuale all'interno; memorizzerà anche il sale codificato nel valore hash risultante, che va bene.

    
risposta data 11.06.2014 - 14:53
fonte
0

Come affermato dalla documentazione di PHP, crypt () accetta solo i primi 8 caratteri della stringa:

The standard DES-based crypt() returns the salt as the first two characters of the output. It also only uses the first eight characters of str, so longer strings that start with the same eight characters will generate the same result (when the same salt is used).

Quindi il tuo sale indebolisce l'intera sicurezza qui. Se è inferiore a 8 caratteri, sarà necessario solo il primo (8-len (salt)) della password dell'utente per l'autenticazione. Se sono 8 o più caratteri, è a barra aperta.

    
risposta data 12.05.2014 - 09:09
fonte

Leggi altre domande sui tag