2011-03-10 10 views
9

Penso di perdere le mie biglie qui ... Ho un problema sul mio sito web dove casualmente smette di accettare gli accessi. Ora sono riuscito a rintracciarlo in crypt() comportandosi in modo molto strano.PHP crypt() risposta errata

Nel mio database, ho la versione criptata della password dell'utente - quindi diciamo Og12345678.

Quando l'utente effettua il login, inserisce la sua password, ho letto il sale del db e poi criptato ciò che è entrato e confrontato - di solito questo funziona molto bene.

Quindi sto facendo crypt ($ insertedPassword, $ saltFromDb) - in questo caso, il sale sarebbe Og ovviamente. Normalmente per un dato utente la cripta della password funziona bene.

Quando le cose vanno male (e quando lo fanno è un cambiamento permanente fino al riavvio di Apache) ho scoperto che crypt inizia a restituire una risposta DIVERSA per lo stesso input con lo stesso sale.

E 'coerente tuttavia, vale a dire una volta che il sistema è andato storto cripta restituisce la risposta sbagliata, ma è sempre il ritorno la risposta sbagliata stesso. Gli aggiornamenti ripetuti della pagina mostrano lo stesso risultato. Lo stesso sale è anche evidente nel risultato della cripta appena errata, quindi non è che il sale sia scomparso da qualche parte.

Se riavvio Apache e rieseguo lo script senza alcuna modifica, i risultati della cripta vengono quindi riportati al modo in cui dovrebbero essere.

Apprezzo che non sia l'ultimo PHP (5.2.8), ma darei valore a qualsiasi vista su questo incluso se si tratta di un bug noto risolto in una versione successiva (l'aggiornamento di PHP non è un compito felice con molti siti alcuni dei quali ancora usa sfortunate stranezze che devono essere nuovamente testate con ogni aggiornamento) - se è un bug noto, allora ovviamente otterrò tutto aggiornato al più presto, al di là del fatto che probabilmente sarò più semplice esternalizzare la cripta esternamente dato che ho solo usalo in un posto comune per il mio sito.

Qualsiasi input apprezzato.

Matt Peddlesden

--- aggiornamento il 11 marzo 2011

Correzione di commentare in precedenza dato sul sistema operativo ... - sistema operativo è Windows Server 2008 SP1 a 64 bit. Mi scuso avrei dovuto ricontrollare piuttosto che presumere che potessi ricordare! Machine è un processore Dell 2950 8gb Ram, Xeon.

Sto iniziando a pensare secondo le linee suggerite da Krtek - quando il sistema è impazzito, se creo un nuovo crypt() (cioè un esempio molto semplice in cui imposto una variabile in una stringa, la crittografa e poi la confronta con la cripta) - tutto funziona alla grande. Quando riavvio il server, di nuovo tutto torna ai calcoli precedenti. Quindi sono decisamente propenso a qualcosa che è cambiando l'algoritmo utilizzato per calcolare il risultato di crypt() ... qualsiasi idea su cosa potrebbe causare questo accada? Ho stampato i valori di CRYPT_STD_DES ecc. E non cambiano tra riavvii.

Qualcuno ha qualche indizio su cosa potrebbe causare questo?

Qualunque cosa fosse sembrata accadere due volte in un giorno ieri, la cosa più strana.

Grazie per le risposte finora.

--- aggiornamento: 16 Mar 2011

Volevo solo per fornire un altro aggiornamento.

Questo sta ancora accadendo, ancora senza ulteriori spiegazioni sul perché.

Nel caso in cui qualcuno si imbatta in questo in futuro, penso che la mia soluzione sta andando a fare un brutto scherzo per spingere tutte le esecuzioni di crypt() su un'applicazione C# esterna e smettere di fare affidamento su PHP per farli. Qualcosa sta andando male da qualche parte e, a questo punto, l'unica soluzione che riesco a vedere è rimuoverlo completamente dall'equazione.

Ovviamente se si verifica ancora, sarà interessante saperlo! :)

Grazie a tutti.

+1

penso che sia improbabile che questo è il tuo problema, ma vedo che il consiglio nella documentazione di PHP - http://php.net/manual/en/function.crypt.php - è che devi passare la password criptata intera (salata) come sale. 'if (crypt ($ insertedPassword, $ cryptedPasswordFromDB) == $ cryptedPasswordFromDB) {...}'. Il punto sembra essere che quindi crypt() può determinare quale algoritmo di hashing è in uso da $ cryptedPasswordFromDB. Ancora una volta, dubito che questa sia la causa del tuo problema, ma potresti dargli una risposta ... –

+1

È possibile che uno script modifichi alcune configurazioni di php risultanti in una diversa funzione di hash usata da crypt? Come detto da @Gareth passando la password completa dal db puoi risolvere questo problema. – krtek

+0

Sto iniziando a pensare secondo le linee suggerite da Krtek - quando il sistema è impazzito, se creo un nuovo crypt() (cioè un esempio molto semplice in cui imposto una variabile in una stringa, la criptico e la confronti con la cripta) - tutto funziona alla grande. Quando riavvio il server, tutto torna a funzionare di nuovo. Quindi sono decisamente propenso a qualcosa che sta cambiando l'algoritmo usato per calcolare il risultato di crypt() ... qualsiasi idea su cosa potrebbe causare che ciò accada? Ho stampato i valori di CRYPT_STD_DES ecc. E non cambiano tra riavvii. –

risposta

1

Potrebbe essere la patch di sicurezza Suhosin PHP che influisce sulla funzione crypt(). Altera molti dei metodi di crittografia/random e potrebbe essere la causa del tuo problema.

Controllare un phpinfo() e vedere se 'suhosin' è in qualsiasi punto della pagina. Se è lì, cerca di disabilitare alcune delle sue funzionalità nella configurazione di php.

+0

Grazie per i vostri commenti, ho controllato il phpinfo() e non ha alcun bit suhosin menzionato da nessuna parte su di esso, quindi presumo che questo non si applica. Il sistema operativo –

2

Perché stai leggendo il sale? E come stai prendendo il sale? Diversi algoritmi utilizzano metodi diversi per includere il sale nell'output.

Basta utilizzare l'intera uscita della funzione crypt come secondo argomento:

$crypted='Og12345678'; 
    if (crypt($_POST['password'], $crypted)==$crypted) { 
     .... 

E solo passaggio DES? Veramente?

L'ultima volta che ho guardato, l'implementazione di crypt PHP avrebbe chiamato la funzione crypt() fornita dal sistema - quindi se ha broekn è più probabile che sia il tuo OS di PHP - ma non hai detto quale tuo OS è.

+0

è Windows Server 2008 SP2. Grazie per i tuoi commenti –

+0

Solo mi consente di aggiungere un commento a riga singola :) - Ho modificato il codice per utilizzare la password completa nel comando crypt() e questo non ha aiutato quando il sistema è andato storto di nuovo un momento fa. –

+0

Sì, DES a singolo passaggio, il sistema è stato scritto molto tempo fa e, sinceramente, non protegge nulla nemmeno in remoto, ma consente semplicemente alle persone di scaricare file dal sito. L'intero sito è pronto per un nuovo sviluppo in una nuova tecnologia ad un certo punto. Ma sì, punto preso :) –

0

Ho affrontato lo stesso problema. Da quando ho spostato l'installazione di vTigerCRM sulla macchina locale, l'accesso utente con password precedentemente memorizzate è iniziato non funzionante. Sembra crypt() sta tornando diversi hash in ambienti diversi con gli stessi argomenti:

On ambiente locale:

SYSTEM: Windows NT 6.1 build 7601 (Business Edition Service Pack 1) i586 
PHP: 5.3.5 

crypt('hello world','$1$ad0000000'): 

    $1$ad00000008tTFeywywdEQrAl9QzV.M1 

On ambiente di produzione:

SYSTEM: Linux 2.6.18-338.9.1.el5.lve0.8.32 #1 x86_64 
PHP: 5.3.5 

crypt('hello world','$1$ad0000000'): 

    $1$ad000000$8tTFeywywdEQrAl9QzV.M1 
+0

Scommetto che non è un problema di crypt(), è jut Windows: P Cosa succede se usi gli stessi parametri in altri sistemi operativi non Windows come RedHat, Solaris, Debian? – Juan

1

ho avuto lo stesso problema con crypt ... Ho avuto quel login-check che funziona su 2 server, ma quando lo trasferisco a quello più nuovo alla fine smetterà di funzionare. Vado in giro con la crittografia MD5 come segue: In register.php

$encrypted = md5($_POST["pass"]); 
... 

E poi nel login.php

$password = md5($_POST["password"]); 
if ($password == $row["hash"]) 
     { 
      // remember that user's now logged in by storing user's details in session 
      $_SESSION["id"] = $row["id"]; 
      $_SESSION['username'] = $_POST['username']; 
      $_SESSION['logged'] = 'Yes'; 
      // redirect to homepage 
      redirect("index.php"); 
     } 

Mi auguro che aiuta :)

Problemi correlati