Você está na página 1de 3

Programao Java para a Web Errata

1 de 3

http://www.javaparaweb.com.br/blog/?cat=11

Usando criptografia no cadastro de usurios


Saturday, November 13th, 2010

O aplicativo desenvolvido no livro trabalha inteiramente com a senha do usurio aberta. Porm no tpico 6.8.2 damos
uma dica de como configurar o Spring Security para trabalhar com a senha criptografada em MD5. O problema que
esta configurao no suficiente para que o sistema inteiro trabalhe com a senha criptografada. Foi ai que o leitor
Rafael Freitas entrou em contato e solicitou que fizessemos um post explicando como fazer esta alterao, o que faz
todo o sentido.
Primeiro uma definio importante: a conhecido algoritmo Base64 na verdade uma codificao e no criptografia,
pois ele reversvel. Para ser considerada uma criptografia o algoritmo tem que ser inversvel, o algoritmo MD5 tem
esta capacidade.
De maneira macro, para que o sistema trabalhe com a senha do usurio criptografada algumas alteraes so
necessrias:
1. Configurao do framework de segurana para trabalhar com a senha criptografada (j realizado no tpico
6.8.2).
2. Decidir onde realizar a encriptao da senha do usurio
3. Encriptar a senha do usurio
4. No exibir a senha criptografada em tela ao editar um usurio
Veremos agora o entendimento de cada alterao e depois a alterao passo a passo.
2 Decidir onde realizar a encriptao da senha do usurio
Seguindo o mtodo utilizado no livro de sempre analisar e argumentar bem em qual camada uma alterao deve ser
feita, vamos pensar sobre a alterao da senha criptografada.
A camada de acesso a dados (UsuarioDAO) deve ser imediatamente descartada, pois como j foi explicado esta
camada apenas transfere dados do sistema para o banco de dados, no deve fazer qualquer alterao ou
transformao.
A camada de regra de negcio (UsuarioRN) uma forte candidata, mas como a senha do usurio ser criptografada e
esta criptografia irreversvel significa que a senha do usurio entrar nela aberta (ao salvar) e sair criptografada (ao
consultar). Acredito que isto pode causar alguma confuso. O ideal que esta camada sempre trabalhe com a senha
em um formato nico.
Desta forma, a camada de visualizao o local correto para fazer a alterao e controlar a criptografia.
Ela obrigatoriamente ir trabalhar com a senha aberta, pois o que o usurio digita na tela, mas assim que receber esta
senha dever encriptar e enviar adiante para salvar, o que garante uma maior segurana.
3 Encriptar a senha do usurio
A encriptao da senha do usurio pode ser feita com uma classe do prprio Spring Security, conforme o exemplo a
seguir:
importorg.springframework.util.DigestUtils;
StringsenhaAberta=teste123;
StringsenhaCripto;
senhaCripto=DigestUtils.md5DigestAsHex(senhaAberta.getBytes());
System.out.println(senhaCripto);

Resultado
aa1bf4646de67fd9086cf6c79007026c

28/06/2015 14:13

Programao Java para a Web Errata

2 de 3

http://www.javaparaweb.com.br/blog/?cat=11

aa1bf4646de67fd9086cf6c79007026c

4 No exibir a senha criptografada em tela ao editar um usurio


A partir do momento que o sistema comear a trabalhar com a senha criptografada no vai mais fazer sentido enviar
esta senha para a tela, para alterao, como j atualmente.
No faz sentido pois pode causa confuso por dois motivos:
A senha em MD5 bem maior que a senha real digitada. Se o usurio digitar uma senha de 5 caracteres, em
MD5 ela ter 32 caracteres. Se ao alterar um registro o usurio perceber esta senha bem maior vai estranhar e
vai achar que est errado.
Enviar a senha criptografada para a tela far com que o campo de senha as vezes tenha uma senha aberta e
outras vezes uma senha criptografada, com certeza confuso.
Ou seja, se for o cadastro de um novo usurio a senha ser preenchida normalmente, ser for uma alterao de usurio
o campo senha dever ser mantido em branco e o usurio somente preencher este campo de quiser alterar a senha,
seno deixa em branco.
Com isso definimos um comportamento do sistema: o campo de senha s ser preenchido com senha aberta.
Porm se a senha for deixada em branco (significando que o usurio quer manter a senha antiga), como vamos salvar
o registro do usurio se esta senha est em branco?
O segredo aqui guardar a senha criptografada do usurio em outro local, quando a tela for aberta para edio
(veremos como fazer no passo a passo).
Para manter o campo da senha em branco e considerar que ele s ser preenchido quando o usurio quiser alterar
existem duas opes:
1. Colocar um aviso junto ao campo dizendo: Preencher somente se quiser alterar.
2. Usar o componente do Primefaces WaterMark, que mostrar a mesma mensagem anterior, s que dentro do
campo. http://www.primefaces.org/showcase/ui/watermark.jsf
Fazendo a alterao passo a passo
1. Crie uma nova propriedade String senhaCriptografada na classe UsuarioBean, gerando os mtodos get e set.
2. Altere os campos de senha de tela para no serem obrigatrios caso seja uma edio de usurio. possvel
identificar isto alterando o atributo required dos campo Senha e Confirmar Senha para:
required=#{empty contextoBean.usuarioLogado}
3. Altere os campos de senha da tela para no re-exibirem a senha, configurando o atributo redisplay=false.
4. Altere o mtodo editar() para armazenar a senha atual na propriedade senhaCriptograda.
5. Altere o mtodo salvar() para recuperar a senhaCriptografada (senha = senhaCriptografada) caso esta no senha
sido preenchida em tela, e para criptografar a senha caso tenha sido preenchida em tela.
6. Inclua na tela usuario.xhtml um campo inputHidden armazenando a senhaCriptografada:
<h:inputHidden value=#{usuarioBean.senhaCriptografada}/>
A classe UsuarioBean (mtodos editar e salvar) ficar conforme o exemplo a seguir:
public String editar() {
this.senhaCriptografada = this.usuario.getSenha();
return "/publico/usuario";
}
public String salvar() {
FacesContext context = FacesContext.getCurrentInstance();
String senha = this.usuario.getSenha();
if (senha != null &&

28/06/2015 14:13

Programao Java para a Web Errata

3 de 3

http://www.javaparaweb.com.br/blog/?cat=11

String senha = this.usuario.getSenha();


if (senha != null &&
senha.trim().length() > 0 &&
!senha.equals(this.confirmarSenha)) {
FacesMessage facesMessage = new FacesMessage("A senha no foi confirmada corretamente");
context.addMessage(null, facesMessage);
return null;
}
if (senha != null && senha.trim().length() == 0) {
this.usuario.setSenha(this.senhaCriptografada);
} else {
String senhaCripto = DigestUtils.md5DigestAsHex(senha.getBytes());
this.usuario.setSenha(senhaCripto);
}
UsuarioRN usuarioRN = new UsuarioRN();
usuarioRN.salvar(this.usuario);
[...]
}

28/06/2015 14:13

Você também pode gostar