A maneira mais fácil de proteger seu esquema de armazenamento de senhas é usando uma biblioteca padrão .
Como a segurança tende a ser muito mais complicada e com mais possibilidades de confusão invisíveis do que a maioria dos programadores poderia enfrentar sozinha, o uso de uma biblioteca padrão é quase sempre a opção mais fácil e segura (se não a única) disponível.
A nova API de senha do PHP (5.5.0+)
Se você estiver usando o PHP versão 5.5.0 ou mais recente, poderá usar a nova API de hash de senha simplificada
Exemplo de código usando a API de senha do PHP:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(Caso você ainda esteja usando o legado 5.3.7 ou mais recente, você pode instalar o ircmaxell / password_compat para ter acesso às funções internas )
Melhorando os hashes salgados: adicione pimenta
Se você deseja segurança extra, o pessoal de segurança agora (2017) recomenda adicionar uma ' pimenta ' aos hashes de senha com sal (automaticamente).
Há uma queda simples na classe que implementa esse padrão com segurança, eu recomendo:
Netsilik / PepperedPasswords
( github ).
Ele vem com uma licença MIT, para que você possa usá-lo como quiser, mesmo em projetos proprietários.
Exemplo de código usando Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
A biblioteca padrão OLD
Atenção: você não precisa mais disso! Isto é apenas aqui para fins históricos.
Dê uma olhada em: Estrutura portátil de hash de senha PHP : phpass e certifique-se de usar o CRYPT_BLOWFISH
algoritmo, se possível.
Exemplo de código usando phpass (v0.2):
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
O PHPass foi implementado em alguns projetos bastante conhecidos:
- phpBB3
- WordPress 2.5+ e bbPress
- a versão do Drupal 7 (módulo disponível para o Drupal 5 e 6)
- outras
O bom é que você não precisa se preocupar com os detalhes, esses detalhes foram programados por pessoas com experiência e revisados por muitas pessoas na internet.
Para obter mais informações sobre esquemas de armazenamento de senhas, leia a postagem no blog de Jeff : Você provavelmente está armazenando senhas incorretamente
Faça o que fizer, se você vai para o ' eu vou fazer isso sozinho, obrigado abordagem', não use MD5
ou SHA1
mais . Eles são um bom algoritmo de hash, mas são considerados quebrados por questões de segurança .
Atualmente, o uso da cripta , com CRYPT_BLOWFISH é a melhor prática.
CRYPT_BLOWFISH no PHP é uma implementação do hash Bcrypt. O Bcrypt é baseado na cifra de bloco Blowfish, usando sua configuração de chave dispendiosa para retardar o algoritmo.