Galera estou tentando criptografar uma senha no momento da inserção do banco usando o padrão DAO, porém não funciona. Alguém pode me dizer porque. Tenho uma tabela login com os seguintes campos: cod autoincremento, usuario e senha. No momento da inserção colocando o MD5(?) na frente do parâmetro, não ocorre a inserção.
Meu DAO
Seu banco tem a função MD5? Se você rodar esse comando na tela do banco de dados, funciona?
jeffev
Bom… Não sei se é a melhor maneira, mas eu mando a senha para o DAO já em MD5.
Hebert_Coelho
jeffev:
Bom… Não sei se é a melhor maneira, mas eu mando a senha para o DAO já em MD5.
Pois é. Eu também faço desse modo.
Por isso perguntei se o banco dele tem essa função MD5. Seria o primeiro banco que eu vejo essa função e a primeira vez que vejo um desenvolvedor utilizar.
O.o
M
marcelokleyton
Como assim mandar a senha para o DAO já em MD5.
Rodrigo_Sasaki
Gere o hash MD5 da senha antes de enviar para o DAO, creio que possa utilizar MessageDigest
marvinla
Dá algum erro de sintaxe na execução?
Cola o stack trace da exceção aqui.
juniorsatanas
erro
juniorsatanas
packagebr.app.sisau.service;importbr.app.sisau.beans.AuditoriaBean;importbr.app.sisau.beans.PessoaBean;importbr.app.sisau.daos.AuditoriaJpaDao;importbr.app.sisau.daos.PessoaJpaDao;importbr.app.sisau.security.beans.PapelBean;importbr.app.sisau.security.daos.PapelJpaDao;importjava.math.BigInteger;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.util.List;importjava.util.Random;importorg.apache.log4j.Logger;publicclassService{privatestaticfinalLoggerlogger=Logger.getLogger(Service.class);/* * Objeto para implementacao do singleton */privatestaticServiceinstance=newService();/* * Metodo construtor privado, para evitar * multipla instanciacao */privateService(){}/* * Metodo que retorna a unica instancia da classe */publicstaticServicegetInstance(){returninstance;}publicStringencryptPassword(Stringinput){MessageDigestmd=null;Stringresult=input;if(input!=null){try{md=MessageDigest.getInstance("MD5");//or "SHA-1"md.update(input.getBytes());BigIntegerhash=newBigInteger(1,md.digest());result=hash.toString(16);}catch(NoSuchAlgorithmExceptionex){logger.debug(ex);}while(result.length()<32){result="0"+result;}}returnresult;}/* * Gera senha randômica da combinação de números e caracteres * maíusculas e minúsculas. * Parâmetro de passagem é o tamanho da senha a ser gerada */publicStringgetRandomPassword(intlength){char[]ALL_CHARS=newchar[62];RandomRANDOM=newRandom();for(inti=48,j=0;i<123;i++){if(Character.isLetterOrDigit(i)){ALL_CHARS[j]=(char)i;j++;}}char[]result=newchar[length];for(inti=0;i<length;i++){result[i]=ALL_CHARS[RANDOM.nextInt(ALL_CHARS.length)];}returnnewString(result);}publicPessoaBeanrealizaLogin(Stringusername,Stringpassword)throwsException{if("".equals(username)){thrownewException("Usernamenãopodeservazio");}if("".equals(password)){thrownewException("Senhanãopodeservazia");}PessoaBeancadastrada=newPessoaJpaDao().findByUsername(username);StringencryptedPassword=encryptPassword(password);if(!encryptedPassword.equals(cadastrada.getPassword())){thrownewException("Senhainválida");}returncadastrada;}publicList<PessoaBean>listarPessoas(){returnnewPessoaJpaDao().findEntities();//return new PessoaJpaDao().pesquisar();}publicPessoaBeanpesquisarPessoaEmail(Stringemail)throwsException{returnnewPessoaJpaDao().findByEmail(email);}publicList<PessoaBean>pesquisarPessoaCriteria(StringtermoPesquisa){returnnewPessoaJpaDao().pesquisarCriteria(termoPesquisa);}publicvoidcadastrarPessoa(PessoaBeanpessoa){newPessoaJpaDao().create(pessoa);}publicvoidatualizarPessoa(PessoaBeanpessoa){newPessoaJpaDao().update(pessoa);}publicvoidexcluirPessoa(PessoaBeanpessoa){newPessoaJpaDao().delete(pessoa);}publicList<AuditoriaBean>listarAuditorias(){returnnewAuditoriaJpaDao().findEntities();}//publicList<PessoaBean>pesquisarPessoas(StringtermoPesquisa){returnnewPessoaJpaDao().pesquisar(termoPesquisa);}publicList<PessoaBean>pesquisarPessoas(){returnnewPessoaJpaDao().pesquisar();}publicPessoaBeanpesquisarPessoa(PessoaBeanpessoa){returnnewPessoaJpaDao().findEntity(pessoa.getId());}}
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagebr.app.sisau.jsf;importbr.app.sisau.beans.PessoaBean;importbr.app.sisau.service.AuditoriaService;importbr.app.sisau.service.I18nService;importbr.app.sisau.service.MailService;importbr.app.sisau.service.Service;importjava.io.Serializable;importjava.util.List;importjava.util.Map;importjavax.faces.application.FacesMessage;importjavax.faces.bean.ManagedBean;importjavax.faces.bean.ViewScoped;importjavax.faces.context.FacesContext;importorg.apache.log4j.Logger;/** * * @author Herick */@ManagedBean(name="loginMB")@ViewScopedpublicclassLoginManagedBeanimplementsSerializable{privatestaticfinalLoggerlogger=Logger.getLogger(LoginManagedBean.class);privateStringusername;privateStringpassword;privateStringemail;privatebooleanfirstTimeLogin=false;privatePessoaBeanpessoa;publicLoginManagedBean(){List<PessoaBean>listaPessoas=Service.getInstance().listarPessoas();if(listaPessoas.isEmpty()){firstTimeLogin=true;pessoa=newPessoaBean();}else{firstTimeLogin=false;}}publicPessoaBeangetPessoa(){returnpessoa;}publicvoidsetPessoa(PessoaBeanpessoa){this.pessoa=pessoa;}publicbooleanisFirstTimeLogin(){returnfirstTimeLogin;}publicvoidsetFirstTimeLogin(booleanfirstTimeLogin){this.firstTimeLogin=firstTimeLogin;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.email=email;}publicStringdoLogin(){if(isCamposValidos()){try{PessoaBeanpessoa=Service.getInstance().realizaLogin(this.username,this.password);FacesContextctx=FacesContext.getCurrentInstance();MapsessionMap=ctx.getExternalContext().getSessionMap();UserSessionManagedBeanuserSessionMB=(UserSessionManagedBean)sessionMap.get("userSessionMB");if(userSessionMB==null){userSessionMB=newUserSessionManagedBean();sessionMap.put("userSessionMB",userSessionMB);}userSessionMB.setLoggedUser(pessoa);AuditoriaService.getInstance().gravarAcaoUsuario(pessoa,"Login no Sistema","Login","Efetuou login no sistema.");return"pessoas?faces-redirect=true";}catch(Exceptione){this.username="";this.password="";FacesContext.getCurrentInstance().addMessage("invalido",newFacesMessage(e.getMessage()));return"login";}}else{return"login";}}privatebooleanisCamposValidos(){booleancamposValidos=true;if("".equals(username)){FacesContext.getCurrentInstance().addMessage("invalido",newFacesMessage(I18nService.getInstance().getKey("username_required")));camposValidos=false;}if("".equals(password)){FacesContext.getCurrentInstance().addMessage("invalido",newFacesMessage(I18nService.getInstance().getKey("password_required")));camposValidos=false;}returncamposValidos;}publicStringdoLogout(){FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("userSessionMB");return"login?faces-redirect=true";}publicvoidrecuperarSenha(){try{PessoaBeanpessoa=Service.getInstance().pesquisarPessoaEmail(email);if(pessoa==null){FacesContext.getCurrentInstance().addMessage("invalido",newFacesMessage(I18nService.getInstance().getKey("mail_not_found")));}else{FacesContext.getCurrentInstance().addMessage("invalido",newFacesMessage(I18nService.getInstance().getKey("mail_sent")));Stringpassword=Service.getInstance().getRandomPassword(8);pessoa.setPassword(Service.getInstance().encryptPassword(password));Service.getInstance().atualizarPessoa(pessoa);Stringsubject="Recuperação de Senha";StringsetTo=pessoa.getEmail();//Para envio de e-mail com HTML: Aspas duplas devem ser precedidas de barra.Stringmessage="Sua senha foi alterada pelo sistema. \n"+"Sua nova senha encontra-se abaixo: \n"+"Nome de Usuário - "+pessoa.getUsername()+" \n"+"Senha - "+password;MailService.getInstance().sendMail(subject,setTo,message);}}catch(Exceptionex){FacesContext.getCurrentInstance().addMessage("invalido",newFacesMessage(ex.getMessage()));}}publicvoidcadastrar(){pessoa.setPassword(Service.getInstance().encryptPassword(password));Service.getInstance().cadastrarPessoa(pessoa);firstTimeLogin=false;FacesContext.getCurrentInstance().addMessage("invalido",newFacesMessage(I18nService.getInstance().getKey("add_success")));Stringsubject="Cadastro no Sistema";StringsetTo=pessoa.getEmail();//Para envio de e-mail com HTML: Aspas duplas devem ser precedidas de barra.Stringmessage="Seu cadastro foi efetuado no sistema. \n"+"Seus dados: \n"+"Nome de Usuário - "+pessoa.getUsername()+" \n"+"Senha - "+password;MailService.getInstance().sendMail(subject,setTo,message);pessoa=newPessoaBean();}}
M
marcelokleyton
Não apresenta nem tipo erro. o que acontece é que o servlet que fará a inserção no banco não o faz, ou seja, não gera a página de resposta.
ViniGodoy
Usar MD5 numa senha de banco é tão seguro quanto aquela substituição de letras por símbolos que as meninas fazem em seus diários.
Resolvido. De acordo com o meu código, testando a instrução diretamente no banco, faltava ajustar o tamanho do campo declarado na tabela com o tamanho da chave criptografa gerada.
juniorsatanas
Meu Grande amigo VINI tem toda razão !
jweibe
Use a biblioteca Cammons Codec ela disponibiliza diversos tipos de criptografia.
ViniGodoy
Não entendi muito o propósito desse MD5.
Você está enviando a senha em texto plano pela rede (assim, pode ser vista tanto no firebug, quanto com um sniffer, como o wireshark). E está só salvando ela com um algorítmo fraquíssimo de hash no banco. Na verdade, esse algoritmo é tão fraco, que é provável que você consiga reverter a senha só procurando pelo hash dela no google.
Então, qual é o propósito de usar o MD5 desse jeito? Se for para ser assim, salva a senha em texto plano direto.