Come WordPress cripta le password?
Possibile Duplicato:
Come validare una password generata da WordPress nel database usando PHP?
Sto lavorando con un sito realizzato con WordPress e ho bisogno di aggiungere alcune parti esterne a WP e verificare il login degli utenti, ma non riesco a trovare come WordPress cripta la password prima di scriverla nel database...
Ho provato con md5 ma non è quello...
Qualcuno sa come verificare la password al di fuori di WordPress, senza utilizzare i suoi plugin/verificatori, con codice PHP puro?

La libreria per la crittografia delle password si trova in /wp-includes/class-phpass.php. Si tratta del Portable PHP Password hashing framework.

Puoi scrivere alcuni esempi su come usarlo? Dato che è ancora un plugin WP, non PHP puro come ho chiesto, ma se puoi scrivere come usarlo all'interno di PHP sarebbe utile...

Sembra che tu voglia utilizzare codice esterno per validare username/password contro il database di WordPress. Se è così, passerai molto tempo a reinventare la ruota. Ma per un buon esempio su come fare questo utilizzando PHP puro, è una buona idea dare un'occhiata alle funzioni core di WP che già lo fanno.
Un caso esemplare è `wp_check_password()':
function wp_check_password($password, $hash, $user_id = '') {
global $wp_hasher;
// Se l'hash è ancora in md5...
if ( strlen($hash) <= 32 ) {
$check = ( $hash == md5($password) );
if ( $check && $user_id ) {
// Rigenera l'hash utilizzando il nuovo sistema.
wp_set_password($password, $user_id);
$hash = wp_hash_password($password);
}
return apply_filters('check_password', $check, $password, $hash, $user_id);
}
// Se l'hash memorizzato è più lungo di un MD5, presumiamo che
// sia il nuovo stile di hash portabile phpass.
if ( empty($wp_hasher) ) {
require_once ( ABSPATH . 'wp-includes/class-phpass.php');
// Di default, usa l'hash portabile da phpass
$wp_hasher = new PasswordHash(8, TRUE);
}
$check = $wp_hasher->CheckPassword($password, $hash);
return apply_filters('check_password', $check, $password, $hash, $user_id);
}
Innanzitutto, WordPress verifica se la password hashata dell'utente utilizza ancora il vecchio MD5 per la sicurezza. Questo serve per mantenere la compatibilità con gli aggiornamenti. Se la password è in MD5, allora WordPress la sostituirà automaticamente con un nuovo hash utilizzando il nuovo sistema (la chiamata a wp_set_password()
). Se non è in MD5, WP passa al nuovo sistema di hashing.
Prima includiamo il Portable PHP Hashing Framework (già menzionato da @John Watson in un'altra risposta) e creiamo un'istanza di esso, memorizzandola nella variabile globale $wp_hasher
.
Poi passiamo la password in testo semplice e l'hash per verificarla, utilizzando il metodo CheckPassword()
della libreria.
Se vuoi utilizzare questo in una libreria esterna, dovrai prima fare include
/require
della libreria, poi istanziarla, quindi passare la tua password in testo semplice e il suo hash. Quindi un po' di pseudo-codice non testato...
function validate_password( $plaintext, $hash ) {
require_once( 'class-phpass.php' );
$hasher = new PasswordHash(8, TRUE);
return $hasher->CheckPassword( $plaintext, $hash );
}
