2013-06-20 13 views
9

Leggendo la documentazione di una nuova password_hash funzione per PHP 5.5, mi chiedo, qual è l'algoritmo predefinito:Qual è l'algoritmo di default in password_hash

password_hash("rasmuslerdorf", PASSWORD_DEFAULT); 

documentazione su di esso non chiarisce questo: http://www.php.net/manual/en/password.constants.php

+1

sembra un hash interno. – DevZer0

+0

Guardando i documenti per http://us2.php.net/password_hash, sembra BCrypt. Lo fanno riferimento nell'input e l'output è simile all'output di BCrypt, ma non posso dirlo con certezza. –

+0

Questo potrebbe cambiare nelle versioni più recenti di PHP quando sono supportati algoritmi di hashing più recenti e più potenti. – hjpotter92

risposta

8

Questo è stato aggiornato nella documentazione allo password_hash() e verrà aggiornato a breve nella pagina delle costanti (ho appena effettuato la modifica della documentazione circa un'ora fa).

Questo sarà in diretta oggi alle password.constants

Dalla pagina costanti aggiornata (che non è ancora andato in diretta, ma sarà più tardi di oggi):

algoritmi disponibili:

  • PASSWORD_BCRYPT (integer)

    PASSWORD_BCRYPT viene utilizzato per c eseguire nuovi hash delle password utilizzando l'algoritmo CRYPT_BLOWFISH.

    Ciò comporterà sempre un hash utilizzando il formato di crittografia "$ 2y $", che è sempre largo 60 caratteri.

    Opzioni supportati:

    • sale - a fornire manualmente un sale da utilizzare quando hash della password. Si noti che questo sostituirà e impedirà la generazione automatica di un sale.

      Se omesso, verrà generato un salt casuale da password_hash() per ogni hash della password. Questa è la modalità di funzionamento prevista.

    • costo - che indica il costo algoritmico che dovrebbe essere utilizzato. Esempi di questi valori possono essere trovati sulla pagina crypt().

      Se omesso, verrà utilizzato un valore predefinito di 10. Questo è un buon costo di base, ma potresti decidere di aumentarlo a seconda dell'hardware.

  • PASSWORD_DEFAULT (integer)

    L'algoritmo predefinito da utilizzare per l'hashing se non viene fornito nessun algoritmo. Questo potrebbe cambiare nelle versioni più recenti di PHP quando sono supportati algoritmi di hashing più recenti e più potenti.

    Vale la pena notare che nel tempo questa costante può (e probabilmente lo sarà) cambiare. Pertanto, si dovrebbe essere consapevoli che la lunghezza dell'hash risultante può cambiare. Pertanto, se si utilizza PASSWORD_DEFAULT, è necessario memorizzare l'hash risultante in un modo che possa contenere più di 60 caratteri (255 è la larghezza consigliata).

    Valori per questa costante:

    • PHP 5.5.0 - PASSWORD_BCRYPT

Per quanto riguarda quando e come PASSWORD_DEFAULT verrà aggiornato, che è sulla password_hash() documentation page:

Nota: Aggiornamenti a algoritmi supportati da questa funzione (o modifiche di default) deve seguire le seguenti regole:

  • Ogni nuovo algoritmo deve essere contenuto nel nucleo per almeno 1 rilascio completo di PHP prima di diventare predefinito. Quindi, se, ad esempio, un nuovo algoritmo viene aggiunto in 5.5.5, non sarà idoneo per impostazione predefinita fino a 5.7 (poiché 5.6 sarebbe la prima versione completa). Ma se un algoritmo diverso è stato aggiunto in 5.6.0, sarebbe idoneo per default a 5.7.0.

  • L'impostazione predefinita deve essere modificata solo su una versione completa (5.6.0, 6.0.0, ecc.) E non su una versione di revisione. L'unica eccezione a questo è in caso di emergenza quando viene rilevato un difetto di sicurezza critico nell'impostazione predefinita corrente.

+0

documentazione aggiornata confermata! hehe :) posso chiederti se sei un membro del team di php dev? O come potresti saperlo? – hek2mgl

+0

@ hek2mgl: Sì, lo sono. E [questa particolare caratteristica] (https://wiki.php.net/rfc/password_hash) era la mia proposta e implementazione. Quindi ho una parziale responsabilità di aiutare a mantenere i documenti aggiornati (e aiutare gli altri con la nuova funzionalità) ;-) – ircmaxell

9

Ho dato un'occhiata al codice sorgente di PHP. Il valore predefinito è bcrypt in PHP5.5.

Da ext/standard/php_password.h line 31:

#define PHP_PASSWORD_DEFAULT PHP_PASSWORD_BCRYPT 
+0

sì, questo è tutto! semplicemente 'wget' i sorgenti e' rgrep' ... Prova questo con closed source! ;) – hek2mgl

+3

Oppure usa [lxr] (http://lxr.php.net), anche tu puoi vedere [questo] (http://blog.ircmaxell.com/2012/03/phps-source-code-for- php-developers.html) per comprendere il codice sorgente di PHP. – Paul

2

La documentazione è in realtà piuttosto specifico, se un po 'mal formulata; l'hash è il più forte che PHP crede di avere a disposizione in quel momento ed è soggetto a modifiche in qualsiasi momento. Gli hash prodotti da password_hash contengono un po 'di dati all'inizio che indicano quale è stato inizialmente utilizzato per produrli, consentendo che tali aggiornamenti si verifichino automaticamente man mano che i nuovi algoritmi di hash diventano disponibili, senza rompere gli hash che sono già stati memorizzati in un database.

Poiché bcrypt è l'unico algoritmo attualmente definito, è probabile che si presuma che sia l'impostazione predefinita, ma un modo rapido per verificare sarebbe creare un semplice script PHP che abbia la stessa stringa due volte, una per ciascuna opzione e una sale fisso e stampa gli hash risultanti; probabilmente combaceranno.

La specifica password_hash originale può essere di aiuto. https://wiki.php.net/rfc/password_hash

Problemi correlati