Então, você quer usar o bcrypt? Impressionante! No entanto, como outras áreas da criptografia, você não deve fazer isso sozinho. Se você precisa se preocupar com algo como gerenciar chaves, armazenar sais ou gerar números aleatórios, está fazendo algo errado.
O motivo é simples: é tão trivialmente fácil estragar o bcrypt . De fato, se você examinar quase todos os trechos de código desta página, notará que está violando pelo menos um desses problemas comuns.
Enfrente, a criptografia é difícil.
Deixe para os especialistas. Deixe para as pessoas cujo trabalho é manter essas bibliotecas. Se você precisa tomar uma decisão, está fazendo algo errado.
Em vez disso, basta usar uma biblioteca. Existem vários, dependendo dos seus requisitos.
Bibliotecas
Aqui está um detalhamento de algumas das APIs mais comuns.
API do PHP 5.5 - (disponível para 5.3.7 ou superior)
A partir do PHP 5.5, uma nova API para hash de senhas está sendo introduzida. Também há uma biblioteca de compatibilidade de calços mantida (por mim) para 5.3.7+. Isso tem o benefício de ser uma implementação revisada por pares e simples de usar.
function register($username, $password) {
$hash = password_hash($password, PASSWORD_BCRYPT);
save($username, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
if (password_verify($password, $hash)) {
//login
} else {
// failure
}
}
Realmente, o objetivo é ser extremamente simples.
Recursos:
Zend \ Crypt \ Password \ Bcrypt (5.3.2 ou superior)
Essa é outra API semelhante à do PHP 5.5 e tem um objetivo semelhante.
function register($username, $password) {
$bcrypt = new Zend\Crypt\Password\Bcrypt();
$hash = $bcrypt->create($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$bcrypt = new Zend\Crypt\Password\Bcrypt();
if ($bcrypt->verify($password, $hash)) {
//login
} else {
// failure
}
}
Recursos:
PasswordLib
Essa é uma abordagem ligeiramente diferente para o hash de senha. Em vez de simplesmente dar suporte ao bcrypt, o PasswordLib suporta um grande número de algoritmos de hash. É principalmente útil em contextos em que você precisa oferecer suporte à compatibilidade com sistemas legados e diferentes que podem estar fora de seu controle. Ele suporta um grande número de algoritmos de hash. E é suportado 5.3.2+
function register($username, $password) {
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$lib = new PasswordLib\PasswordLib();
if ($lib->verifyPasswordHash($password, $hash)) {
//login
} else {
// failure
}
}
Referências:
- Código-fonte / Documentação: GitHub
PHPASS
Esta é uma camada que suporta bcrypt, mas também suporta um algoritmo bastante forte que é útil se você não tiver acesso ao PHP> = 5.3.2 ... Na verdade, ele suporta o PHP 3.0+ (embora não com o bcrypt).
function register($username, $password) {
$phpass = new PasswordHash(12, false);
$hash = $phpass->HashPassword($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$phpass = new PasswordHash(12, false);
if ($phpass->CheckPassword($password, $hash)) {
//login
} else {
// failure
}
}
Recursos
Nota: Não use as alternativas PHPASS que não estão hospedadas no openwall, pois são projetos diferentes !!!
Sobre o BCrypt
Se você notar, cada uma dessas bibliotecas retorna uma única sequência. É por isso que o BCrypt funciona internamente. E há uma tonelada de respostas sobre isso. Aqui está uma seleção que eu escrevi, que não vou copiar / colar aqui, mas link para:
Embrulhar
Existem muitas opções diferentes. A escolha que você escolher depende de você. No entanto, gostaria ALTAMENTE recomendamos que você use uma das bibliotecas acima para lidar com isso para você.
Novamente, se você estiver usando crypt()
diretamente, provavelmente está fazendo algo errado. Se o seu código estiver usando hash()
(ou md5()
ousha1()
) diretamente, você está quase definitivamente fazendo algo errado.
Basta usar uma biblioteca ...