Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom, uns dias atras abri um topico sobre as melhores criptografias para senha, TOPICO, então seguindo o concelho da galera, fiz usando a Bcripty, e ficou da seguinte forma a função de login
Aqui é a criação do objeto e a chamada da função apos o preenchimento no formulário, peguei apenas a parte necessária, já foi tudo filtrado e enviado nessa parte.
$cliente = new Cliente($email, $senha);
$FazerLogin = new ClientePdo();
$logou = $FazerLogin->fazer_login($cliente, $senha);
if ($logou === true) {
$sessao = new Sessao();
$sessao->carregaSessao($logou);
}else{
echo "Verifique os dados";
}
Logo então é chamada a função fazer_login, então abaixo o código
public function fazer_login($cliente, $senha){
try{
if($this->validar_senha($cliente, $senha) === true){
$query = "SELECT * FROM clientes WHERE email = :email";
$this->Select = $this->Conn->prepare($query);
$this->Select->BindValue(':email', $cliente->getEmail(), PDO::PARAM_STR);
$this->Select->execute();
if($this->Select->rowCount() == 1){
return $this->Select->fetch(PDO::FETCH_ASSOC);
}else{
return false;
}
}else{
return "Senha Invalida!";
}
} catch (PDOException $ex) {
exibeMensagens($Msg, $ErrNo);
}
}
Logo na primeira linha da função ja existe uma outra chamada, validar_senha com o objeto e a senha enviada separadamente, e compara se o resultado é true;
então vamos ao código da função.
private function validar_senha($cliente, $senha){
try{
$dados = $this->dados_usuario($cliente);
if($dados != null){
foreach($dados as $x){
$hash = $x['senha'];
if($hash != null){
if (crypt($senha, $hash) === $hash) {
return true;
} else {
return false;
}
}
}
}
} catch (PDOException $ex) {
exibeMensagens($Msg, $ErrNo);
}
}
Como podem ver, eu fiz um metodo para comparar as senhas digitada e a senha registrada no banco, e depois, para pegar os dados e fazer o login eu faço ele apenas com um where no email, mas ele entra lá só se as senhas forem iguais,
É a primeira vez que faço dessa forma, a pergunta é, é seguro fazer login comparando senha e email separadamente? Eu fiz varias tentativas aqui, e quando digitava senha errada, ou email errado não entrava, e quando digitava uma senha de uma outra conta tambem não, me pareceu seguro, mas conto com a opinião de vocês, pois é algo grande.
// Repetição desnecessária de $senha
{
crypt/cipher/CipherInterface.php
interface CipherInterface
{
/**
* @param string|null $raw_password
*/
Agora vamos implementar nossa interface na classe a seguir
crypt/cipher/Blowfish.php
class Blowfish implements CipherInterface
{
class Crypt
{
/**
* @var CipherInterface
*/
// Instanciamos e usamos Blowfish
$crypt = new Crypt(new Blowfish($password));
/*
* Exemplo básico
/
$cipher = $crypt->getCipher();
try {
catch (\InvalidArgumentException $e) {
/*
* Exemplo com mais opções
/
$cipher = $crypt->getCipher();
try {
catch (\InvalidArgumentException $e) {
/**
* @param CipherInterface|null $cipher
*/
public function __construct(CipherInterface $cipher = null)
{
/*
* Exemplo com um algoritmo padrao
/
try {
catch (\InvalidArgumentException $e) {
class MyAlgoritm implements CipherInterface
{}
Fiz apenas alguns testes básicos aqui, apenas para colocar pra funcionar, mas acredito que didaticamente vai ser útil para seus estudos.