Hash as senhas com segurança

Eu acredito que você não armazena senhas em texto simples. Mas muitos programadores ainda armazenam senhas com hash MD5, talvez salgadas. De acordo com isso: http://en.wikipedia.org/wiki/MD5 – alguns processadores gráficos podem computar de 16 a 200 milhões de hashes por segundo. Tente também pesquisar no Google por cracker de hash salgado md5 .

MD5 foi projetado para verificações de integridade de dados – calcule hash de arquivo, rápido plz!

É por isso que MD5 não deve ser usado para hash de senha.

Então, como fazer hash de senhas com segurança? Eu uso esta função:

function calculateHash($password, $salt = NULL) {
return crypt($password, $salt ?: '$2a$07$' . Strings::random(22));
}

Agora, para obter a senha com hash, chame calculateHash($plainpass)e para verificar a senha, use essa senha com hash como segundo parâmetro:

if($hashedPassFromDb == calculateHash($plainpass, $hashedPassFromDB)){ 
// correct!
} else {
// blah!
}

Docs: http://php.net/crypt

Strings :: random: http://api.nette.org/2.1.0/source-Utils.Strings.php.html#399-428