John Five 0 Denunciar post Postado Agosto 24, 2011 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
Fabiano Abreu 22 Denunciar post Postado Agosto 24, 2011 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
John Five 0 Denunciar post Postado Agosto 25, 2011 Realmente Fabiano, o que não estava dando certo eram essas passagens de parametros equivocadas! Valeu pelas dicas! Compartilhar este post Link para o post Compartilhar em outros sites
Fabiano Abreu 22 Denunciar post Postado Agosto 25, 2011 Disponha, e obrigado pelo retorno. _ _ Fabiano Abreu Papo Sql - Tutoriais, dicas e truques sobre SQL Compartilhar este post Link para o post Compartilhar em outros sites