Salve a tutti, passando dalla versione 2.5.x alla 3.x ho notato un piccolo ma radicale cambiamento nello stoccaggio delle password nel database di joomla.
Credo che questo cambiamento sia addirittura stato introdotto in uno degli ultimi update di Joomla 2.5.19 (che era l'ultima versione in cui controllai questo particolare)
come tutti o quasi sappiamo, Joomla (come altri cms ormai) non conserva in chiaro le password salvate ma utilizza un particolare algoritmo di hash ovvero
md5(password+salt):salt
questo è un esempio di password di helloword+ salt random di 32 caratteri
85d9b7362e3c2977d5daec1cc6e771dd:RfT3fY4oLohcRQNkl ZXv0IjUS5Pnj5E
("helloword"+ salt) : salt
verificare quindi la password di un utente era abbastanza semplice tramite php senza scomodare Joomla ma...
dagli ultimi aggironamenti mi sono ritrovato questo una roba simile a questa
$P$DssuWDSsrHZ7iB2aCk5PMA.YefKpeH0
la password qui sopra è sempre helloword codificata però tramite un nuovo algoritmo di hashing..
Spulciando il file helper.php di joomla ho notato tutte le possibilità di stoccaggio delle password e in particolare una parte che serve ad aggiornare tutte le vecchie password md5(psw+salt):salt alla nuova codifica
Codice PHP:
public static function hashPassword($password)
{
// Use PHPass's portable hashes with a cost of 10.
$phpass = new PasswordHash(10, true);
return $phpass->HashPassword($password);
}
/**
* Formats a password using the current encryption. If the user ID is given
* and the hash does not fit the current hashing algorithm, it automatically
* updates the hash.
*
* @param string $password The plaintext password to check.
* @param string $hash The hash to verify against.
* @param integer $user_id ID of the user if the password hash should be updated
*
* @return boolean True if the password and hash match, false otherwise
*
* @since 3.2.1
*/
public static function verifyPassword($password, $hash, $user_id = 0)
{
$rehash = false;
$match = false;
// If we are using phpass
if (strpos($hash, '$P$') === 0)
{
// Use PHPass's portable hashes with a cost of 10.
$phpass = new PasswordHash(10, true);
$match = $phpass->CheckPassword($password, $hash);
$rehash = false;
}
else
{
// Check the password
$parts = explode(':', $hash);
$crypt = $parts[0];
$salt = @$parts[1];
$rehash = true;
$testcrypt = md5($password . $salt) . ($salt ? ':' . $salt : '');
$match = JCrypt::timingSafeCompare($hash, $testcrypt);
}
// If we have a match and rehash = true, rehash the password with the current algorithm.
if ((int) $user_id > 0 && $match && $rehash)
{
$user = new JUser($user_id);
$user->password = self::hashPassword($password);
$user->save();
}
return $match;
}
/**
* Formats a password using the current encryption.
*
* @param string $plaintext The plaintext password to encrypt.
* @param string $salt The salt to use to encrypt the password. []
* If not present, a new salt will be
* generated.
* @param string $encryption The kind of password encryption to use.
* Defaults to md5-hex.
* @param boolean $show_encrypt Some password systems prepend the kind of
* encryption to the crypted password ({SHA},
* etc). Defaults to false.
*
* @return string The encrypted password.
*
* @since 11.1
*
* @deprecated 4.0
*/
più in basso sempre nell'helper.php tutte le tipologie possibili di hashing utilizzabili su joomla
Codice PHP:
case 'plain':
...
case 'sha':
...
case 'crypt':
...
case 'crypt-des':
...
case 'crypt-md5':
...
case 'crypt-blowfish':
...
case 'md5-base64':
...
case 'ssha':
...
case 'smd5':
...
case 'aprmd5':
...
case 'md5-hex':
...
in un primo momento per non modificare un intero php creato da me per verificare le password degli utenti avrei voluto ritornare alla vecchia codifica, ma con il senno di poi preferisco comprendere come utilizzare questa nuova codifica cosi' da poter comparare le password immesse con quelle salvate, ovvero l'utente inserisce la password, direttamente da php genero l'hash , al massimo prelevo il salt dal database (credo che ci sia anche qui) e comparo hash salvato con quello generato .
Qualcuno di voi sì è già cimentato? riconosce per caso la codifica? Io ho notato una certa somiglianza con queste per via dei caratteri $X$ dove X di solito è una costante che accomuna tutte le password e può essere un qualsiasi carattere alfanumenrico..
Codice:
Apache CRYPT password hash (advanced authentication)
nel file .htpasswd (username:hash) con salt. Utilizzate su WordPress 3.x
MD5 Crypt hash
$1$in0n33n2$vhiiaIW3I6xgTxsLQE7Ir/
BlowFish Crypt hash
$2a$07$oKunIwJYxdIxzzo6oJGCW.kfe70slf.y1H17ZKuu5FpOyvms7tawe
attendo fiducioso ;) magari ne esce un post abbastanza utile