How your own content management system stores passwords can be determined by analysing its source code or by looking into its database. The latter solution is easiest and can simply be achieved by establishing a connection to the database server, for example like this:
mysql -u <user> -p. The "user" parameter designates the registered database user which is used for the CMS to sign into the server. The command
show databases; lists all available databases. For instance, to select the typo3 database, enter
use typo3; (don't forget the semicolon at the end). All available database tables can subsequently be displayed using
Under Typo3, the most interesting tables are be_users and fe_users.
select * from be_users; displays the table contents. If the user passwords contain a simple sequence of characters such as
1ee9e0daf4a2b81fe4064aa5ae31aae4, the system is using a simple, unsalted MD5 string.
In current Drupal installations, a (user table) password hash that is stored in the database may look like
The dollar signs at the beginning enclose the hash type and are followed by the salt and the actual hash. The hash type value of 2a designates bcrypt. WordPress (wp_users table) will produce entries like
$P$Bz0ZwGCmWuvcurZbj4CaptBFir8gQv1 – the "P" hash type designates what is called a portable hash – in other words, the MD5 variant.
Phpass is very easy to integrate into PHP applications. It consists of a single PHP file with one class and several methods. Although in modern versions of PHP all hash algorithms can also be called directly, the advantage of using phpass is that there is no need to worry about creating a random salt or assembling the character string. The returned hash string can be stored directly in the database.
On UNIX systems, phpass creates the salt by reading /dev/urandom, and under Windows it uses the microtime() PHP function. Two lines are sufficient to generate a secure password hash:
$t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($password);
The FALSE parameter in the constructor tells phpass to choose the most secure algorithm first – on modern systems, this will typically be bcrypt. Submitting TRUE forces the insecure, but more compatible, MD5 implementation to be used; this is, for instance, the approach chosen by WordPress. The constructor also generates the salt. In bcrypt, the 8 parameter determines the exponent for the required number of iterations, meaning that bcrypt uses 256 rounds. The maximum exponent is 31.
The HashPassword method then generates the hash from the password and the salt. Checking an entered password is equally simple:
$check = $t_hasher->CheckPassword($password, $hash);
The $check variable contains the result of the comparison, where 1 is true.
Rather than relying on their system's default settings, administrators should implement the most secure methods – and let their users know about it. However, when visiting a forum or online store, users have no influence on whether the operator uses a secure method. Even worse, it isn't possible to ascertain which password encryption method is being used. Therefore, the best way for users to protect themselves is by always choosing different passwords. Using identical passwords for the Typo3 CMS and for a PayPal account should be avoided. The basic rule is: length is trumps – as long as the word isn't contained in a dictionary. Passwords for less important accounts may be a bit shorter than those used for premium services.