Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

John Five

[Resolvido] Procedure Encriptar senha e Autenticar Usuario.

Recommended Posts

Fala galera! Sou novo aqui no forum e iniciante em mysql também.

 

É o seguinte, eu tenho duas tabelas: Cliente e Conta.

 

CREATE  TABLE IF NOT EXISTS `Advocacy`.`Customer` (
 `ID` INT NOT NULL AUTO_INCREMENT ,
 `CustomerName` VARCHAR(50) NOT NULL ,
 `DateCreated` DATETIME NOT NULL ,
 PRIMARY KEY (`ID`) 
)
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `Advocacy`.`Account` (
 `ID` INT NOT NULL AUTO_INCREMENT ,
 `CustomerID` INT,
 `UserLogin` VARCHAR(50) NOT NULL ,
 `Pass` VARCHAR(250) NOT NULL ,
 `DateCreated` DATETIME NOT NULL ,
 `Situation` INT NOT NULL , /* 1 = conta ativada, 0 = conta desativada */
 PRIMARY KEY (`ID`) ,
 UNIQUE INDEX `UserLogin_UNIQUE` (`UserLogin` ASC) ,
 CONSTRAINT `FK_Account_Customer`
   FOREIGN KEY (`CustomerID` )
   REFERENCES `Advocacy`.`Customer` (`ID` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)
ENGINE = InnoDB;

 

E criei 3 procedures, uma para inserir a conta com a senha encriptada, outra para atualizar a conta, e uma para autenticar os usuários.

 

/* Cria um registro na tabela Account criptografando a senha. */

delimiter //

CREATE PROCEDURE InsertEncryptAccount (IN var_CustomerID INT, IN var_UserLogin VARCHAR(50), IN var_Pass VARCHAR(250) )
BEGIN

   DECLARE var_CustomerID INT;
   SET var_CustomerID = LAST_INSERT_ID();

   INSERT INTO Account (CustomerID,UserLogin,Pass,Situation,DateCreated)
   VALUES ((SELECT var_CustomerID), var_UserLogin ,AES_ENCRYPT(var_Pass, SHA1('keypass'),1,CURTIME()));

END//

delimiter ;

 

/* Atualiza um registro na tabela Account criptografando a senha. */

delimiter //

DROP PROCEDURE IF EXISTS UpdateAccountEncrypted //

CREATE PROCEDURE UpdateAccountEncrypted (IN var_AccountID INT, IN var_UserLogin INT, IN var_Pass VARCHAR(250), IN var_Situation INT)
BEGIN
      UPDATE
           Account
      SET 
           UserLogin = var_UserLogin,
           Pass = AES_ENCRYPT(var_Pass, SHA1('keypass')),
           Situation = var_Situation
      WHERE   
           ID = var_AccountID; 

END //

delimiter ;

 

/* Autentica Usuário */
DELIMITER $$

DROP PROCEDURE IF EXISTS AuthenticateUser $$

CREATE PROCEDURE AuthenticateUser (OUT var_UserLogin VARCHAR(50), OUT var_Pass VARCHAR(250), OUT var_Situation INT)

BEGIN
IF var_Situation = 1 THEN

   SELECT 
       C.ID,
       C.CustomerName,
       A.ID
   FROM
       Customer C JOIN
       Account A ON C.ID = A.CustomerID
   WHERE
       A.UserLogin = var_UserLogin AND AES_DECRYPT(var_Pass, SHA1('keypass')) = A.Pass;

   ELSE

   CALL Fail('Conta Desativada');

   END IF;

END $$

DELIMITER ;

 

Gostaria da opinião dos mais experientes, se está certo esse modo de passar o campo CustomerID na Procedure InsertEncryptAccount, e que me apontasse provaveis erros no meu código, e se houver uma maneira melhor de encriptar e autenticar, gostaria de sugestões.

 

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá John Five,

 

Eu particularmente prefiro utilizar a criptografia em formato MD5. Mas ai vão me dizer, "ha mas MD5 não tem como descriptografar", tudo bem, mas pra que você deseja saber a senha dos seus usuários?

 

E outra, utilizando o md5, se caso você migrar de banco de dados, por exemplo: MySQL > PostgreSQL, é só migrar o hash é funcionará perfeitamente no novo banco.

 

A sua criação do usuário achei poderia ser melhorada, ex: Você declara var_CustomerID recebendo last_insert_id, porém var_CustomerID é um parâmetro de entrada, e como você vai já possui o id do usuário mesmo antes de gera-ló. Sei que isto é possível, mas na visão exposta creio que não funcionará corretamente.

 

Não compreendi foi, você pede como parâmetro var_Situation. Ao meu ver, você ira checar isto na validação do usuário, e não pedir como parâmetro de entrada.

 

Mas assim, isto são minhas opiniões, se a rotina está funcionando toca o barco.

 

_ _

Fabiano Abreu

Papo Sql - Tutoriais, dicas e truques sobre SQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.