MVC - Em qual camada criptografar senhas

311 views
Skip to first unread message

Rafael Neves

unread,
Jul 14, 2011, 10:52:36 AM7/14/11
to jav...@googlegroups.com
Pessoal, bom dia!

Estou com uma dúvida a respeito do meu projeto, pois tenho que criptografar a senha do usuário, mas devo fazer isso onde? costumo fazer isso no controller, está correto?

--
Att,
Rafael Neves
Cursando Análise e Desenvolvimento de Sistemas
Em breve um analista!!!
Contato: Ranev...@gmail.com

Walter Mourão

unread,
Jul 14, 2011, 11:00:18 AM7/14/11
to jav...@googlegroups.com
vc está usando uma camada de serviços ? se estiver, todas as regras de negócio devem ficar lá...

Walter Mourão
http://waltermourao.com.br
http://arcadian.com.br
http://oriens.com.br



2011/7/14 Rafael Neves <raneves.mg@gmail.com>

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Felipe George

unread,
Jul 14, 2011, 12:11:27 PM7/14/11
to jav...@googlegroups.com
cara a camada controller serve apenas para vc colocar seus beans.
validacoes , logica e etc e tals, eh legal vc colocar na camada de negocio(business service)..

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
I Belong Jesus Christ

Rafael Neves

unread,
Jul 14, 2011, 12:40:40 PM7/14/11
to jav...@googlegroups.com
isso aí é meio complicado, porque o negócio é MVC model view controller...
view= .jsp/jsf
model = pojos
controller = servlets c/ regra de negócio
e temos também o DAO com acesso ao banco....
devo criar ainda um outro pacote ? aí n será mvc.
estou errado?

Rafael de Paula Souza

unread,
Jul 14, 2011, 12:53:46 PM7/14/11
to jav...@googlegroups.com
http://www.fragmental.com.br/wiki/index.php?title=MVC_e_Camadas
--
Rafael de Paula Souza

http://br.linkedin.com/in/rafaelpsouza

Sublimus - Desenvolvimento de Software e Soluções Web.
www.sublimus.com.br

Lucas De Luca Castro

unread,
Jul 14, 2011, 12:56:02 PM7/14/11
to jav...@googlegroups.com
olá Rafael,

eu sugiro que seja na view
realizando requisicao de post ou get, a senha estara visivel, sendo possivel captura pela rede...

2011/7/14 Rafael Neves <raneves.mg@gmail.com>

Felipe George

unread,
Jul 14, 2011, 2:16:35 PM7/14/11
to jav...@googlegroups.com
cara, tipo... qndo vc qr construir uma app desacoplada , faça a coisa certa...... MVC num qr dizer q vc tem q colocar apenas tres camadas....
dentro da camada model vc cria a sua camada de negocio.... o servlet ele deve ficar na camada control, pq o servlet vai receber as acoes da view e direcionar as execucoes para sua camada de negocio fazer toda a logica e depois mandar para a camada de persistencia....
 
 
view == paginas
 
controll == servlets, beans, actions
 
model == classe dominio, classe de negocio, servicos
 
model.negocio == logica do negocio
model.dominio == classe de dominio
model.persistencia == classes de persistencia
 
entendeu ??

Gustavo Souza

unread,
Jul 14, 2011, 2:19:59 PM7/14/11
to jav...@googlegroups.com
Rafael,

Esse link resolverá seu problema facilmente.

http://serjaum.wordpress.com/2009/08/31/jsf-criptografia-de-senhas-com-md5/


Em 14 de julho de 2011 13:56, Lucas De Luca Castro <luca...@gmail.com> escreveu:



--
Att,

Gustavo Souza
53 9163.2838
msn: gustavo...@gmail.com
linux user: #533652
twitter: @gustavocdesouza

Rafael Neves

unread,
Jul 14, 2011, 3:07:54 PM7/14/11
to jav...@googlegroups.com
hehee, vlw a dica pessoal. esse problema de arquitetura me deixa muito confuso, tenho mais dificuldade em saber onde colocar cada classe do que efetivamente fazê-las...
vou dar uma olhada nos links e caso tenho mais alguma dúvida retorno aos colegas, muito obrigado!

Kenji

unread,
Jul 15, 2011, 8:20:30 AM7/15/11
to jav...@googlegroups.com
tem um jeito muito fácil de testar a sua arquitetura

faça o seu sistema

quando ele estiver do meio pro fim, faça de conta que vc é um gerente sacana e invente uma modificação do tipo

[1] eu queria que isso rodasse, além da web, num celular também
[2] em queria que isso rodasse também em modo batch, em linha de comando
[3] eu queria que isso funcionasse com o dobro de carga/requisições
[4] eu queria que isso rodasse nesse outro banco de dados aqui também
[5] eu queria fazer um segundo sistema que usasse metade das coisas do seu projeto, mas como web service
[6] eu queria fazer isso tudo que vc fez em richfaces, em primefaces

dependendo do trabalho que vc tiver para modificar as coisas, vc vai perceber rapidinho se sua arquitetura é boa ou não ;-)

lembre-se que arquitetura não é uma coisa tirada do c*. Boa arquitetura foi criada para resolver problemas práticos.

[]

Kenji

Carlos Martins

unread,
Jul 15, 2011, 9:39:19 AM7/15/11
to jav...@googlegroups.com
Cara cria um pacote tipo br.com.util.Criptografia
 
Dentro dele vc cria a classe(Criptografia) com os métodos para criptografar senhas, urls, etc e tal..
 
Depois é só vc chamar esse método na classe onde vc válida os dados recebidos e após essa validação, vc aplica o método para criptografar os dados(no seu caso o campo senha)..
 
Servlet ou ManagedBean.
 
Geralmente utilizado o nome util para o pacote onde crio classes de serviços( só para deixar claro na minha opinião pacote de negócios"business" e pacote de serviços"util" são totalmente diferentes ) 
Em 14 de julho de 2011 11:52, Rafael Neves <raneves.mg@gmail.com> escreveu:

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Carlos Martins
 
Skipe: guttomarttins
Celular: 83833681 
 

Rafael Neves

unread,
Jul 15, 2011, 10:04:14 AM7/15/11
to jav...@googlegroups.com
obrigado, Carlos.

adotarei essa solução.

Jean Jorge Michel

unread,
Jul 15, 2011, 10:13:02 AM7/15/11
to jav...@googlegroups.com
Sempre que preencho um campo de tele com a senha, já passo ela para criptografada.
Depois é só ir no banco e comparar. Sem traumas.



package com.util;

 

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

 

/**

 * This class provides a simple way to encrypt passwords before store it into

 * data base or travel between web server and application server.

 *

 * @author jmichel

 * @version 1

 */

public class PasswordUtil {

 

    /**

     * This method uses SHA-256 algorithm to encrypt the password passed as

     * parameter, resulting a String containing a hash code impossible to

     * revert.

     *

     * @param password the password to encrypt.

     * @return a String (64 characters) containing a hash code impossible to

     * revert.

     */

    public static final String hashPassword(final String password) {

        String resultPassword = null;

       

        try {

            MessageDigest algorithm = MessageDigest.getInstance("SHA-256");

            byte messageDigest[] = algorithm.digest(password.getBytes("UTF-8"));

            StringBuilder hexString = new StringBuilder();

           

            for (byte b : messageDigest) {

                hexString.append(String.format("%02X", 0xFF & b));

            }

           

            resultPassword = hexString.toString();

        }

        catch (NoSuchAlgorithmException e) {

            throw new RuntimeException(e.getMessage());

        }

        catch (UnsupportedEncodingException e) {

            throw new RuntimeException(e.getMessage());

        }

       

        return resultPassword;

    }

}



e depois usa onde precisar, como aqui:

package com.managedbean;

 

import static com.util.PasswordUtil.hashPassword;

import static com.util.MessagesUtil.getMessage;

import java.io.Serializable;

import java.util.logging.Logger;

import javax.ejb.EJB;

import javax.faces.application.FacesMessage;

import javax.faces.bean.ManagedBean;

import javax.faces.context.FacesContext;

import javax.servlet.http.HttpSession;

import com.model.entity.User;

import com.model.entity.facade.UserFacade;

 

@ManagedBean(name="accessControlBean")

public class AccessControlBean implements Serializable {

   

    private static final long serialVersionUID = 8188482045425598742L;

    private Logger logger = Logger.getLogger("com.managedbean.AccessControlBean");

    private String username;

    private String password;

    @EJB

    private UserFacade userFacade;

    private final FacesContext facesContext = FacesContext.getCurrentInstance();

   

    public void setUsername(String username) {

        this.username = username;

    }

   

    public String getUsername() {

        return this.username;

    }

   

    public void setPassword(String password) {

        this.password = hashPassword(password);

    }

   

    public String getPassword() {

        return this.password;

    }

   

    public String doLogin() {

        User u = userFacade.findUserByUsername(this.username);

       

        if(u != null && u.getPassword().equals(this.password)) {

            logger.info("User accepted");

            this.facesContext.getExternalContext().getSessionMap().put("userAuthenticated", u);

            return "/faces/home.xhtml";

        }

        else {

            logger.info("User do not exists or incorrect password");

           

            this.facesContext.addMessage(null,

                                         new FacesMessage(FacesMessage.SEVERITY_ERROR,

                                                         getMessage("loginError"),

                                                         getMessage("loginError")));

            return "/faces/login.xhtml";

        }

    }

   

    public String doLogoff() {

        logger.info("Log out user");

       

        this.facesContext.getExternalContext().getSessionMap().remove("userAuthenticated");

        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);

        session.invalidate();

       

        return "/faces/login.xhtml";

    }

   

    public AccessControlBean() {

    }

}



--
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blogs: http://www.jeanjmichel.blogspot.com and http://www.anonymousbiker.wordpress.com
My Twitter: http://twitter.com/jeanjmichel

Rafael Ponte

unread,
Jul 15, 2011, 10:19:19 AM7/15/11
to jav...@googlegroups.com
Jean,

Eu só acho que seu controller está fazendo mais do que deveria. A autenticação poderia ficar na camada de aplicação, um service/façade e o controller somente delegar para ela. Facilitaria a legibilidade e escrita de testes de unidade para sua classe de controller.

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Rafael Ponte
http://www.rponte.com.br

Jean Michel

unread,
Jul 15, 2011, 11:02:29 AM7/15/11
to jav...@googlegroups.com
Bem pensado. Assim aproveito o mesmo objeto p outra view layer como desktop. Vou fazer isso. 

Vlw


Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)

Leonardo Rodrigues Marques

unread,
Jul 15, 2011, 10:49:24 AM7/15/11
to javasf: JavaServer Faces Group
Rafael,

Antes você tem que responder a duas perguntas:

- Você quer proteger a senha para você não conheça a senha, então
você deve criptogravar na controller, ou se você tiver uma camada de
negócio, na camada de negócio.

- Você quer proteger a senha para evitar que alguem possa capturar
a senha do seu usuário pela Internet, então você deve criptogravar a
senha com um javascript na página web, antes de ser enviada.

Eu criptografo a senha com MD5, ou SHA-1, ou SHA-256, ou com
SHA-512, depois na minha cadama de negócio eu adiciono um salt e
criptograva de novo.

Atenciosamente,

Leonardo Rodrigues Marques
Analista de Sistema
> Contato: Raneves...@gmail.com

Igor Thiago

unread,
Jul 15, 2011, 11:31:59 AM7/15/11
to jav...@googlegroups.com
Sempre que trabalho com algorítmos de criptografia utilizo ele diretamente dentro do setSenha ... desta forma fica mais prático e seguro.


--
Igor Thiago Vulcão da Silva
Bach. em Ciência da Computação
Programador Java
WEB Designer

Contato: (91) 8120-1949
E-mail: vulcaod...@gmail.com
MSN: thiagor...@hotmail.com
Reply all
Reply to author
Forward
0 new messages