One way to compromise between security and readability is to generate
a password for a user out of actual words interrupted by some
numbers.
$words =
array('dished','mother','basset','detain','sudden','fellow','logged','sonora',
'earths','remove','dustin','snails','direct','serves','daring','cretan',
'chirps','reward','snakes','mchugh','uphold','wiring','gaston','nurses',
'regent','ornate','dogmas','singed','mended','hinges','latent','verbal',
'grimes','ritual','drying','hobbes','chests','newark','sourer','rumple');
mt_srand((double) microtime() * 1000000);
$word_count = count($words);
$password = sprintf('%s%02d%s',
$words[mt_rand(0,$word_count - 1)],
mt_rand(0,99),
$words[mt_rand(0,$word_count - 1)]);
print $password;
This code produces passwords that are two six-letter words with two
numbers between them, like mother43hinges or
verbal08chirps. The passwords are long, but
remembering them is made easier by the words in them.