Pessoal,
o sistema valida o usuário, mas não a senha.
Estou fazendo assim: primeiro instanciei o map na classe Usuarios static Map<String,String> usuarios = new HashMap<String,String>();
e não usei construtor; depois encapsulei usuarios [code] public static Map<String,String> getUsuarios() {
usuarios.put(“root”,DigestUtils.sha256Hex(“senha0”));
usuarios.put(“paulo”,DigestUtils.sha256Hex(“senha1”));
usuarios.put(“maria”,DigestUtils.sha256Hex(“senha2”));
usuarios.put(“alguém”,DigestUtils.sha256Hex(“senha3”));
return usuarios;
}
public void setUsuarios(Map<String,String> usuarios) {
Usuarios.usuarios = usuarios;
}
[/code] com as entradas dentro; na classe Gerente, o método validar() faz as verificações public static void validar(String usr, String snh){
if(usr.isEmpty()){
JOptionPane.showMessageDialog(login, "Usuário vazio.");
Login.ftfUsuario.grabFocus();
} else {
if(Usuarios.getUsuarios().containsKey(usr)){
if(snh.isEmpty()){
JOptionPane.showMessageDialog(
login,"O campo \"senha\" está vazio.");
}else {
if(Usuarios.getUsuarios().get(usr).equals(snh)){
registros = new Registros();
registros.setVisible(true);
login.setVisible(false);
} else {
JOptionPane.showMessageDialog(
login, "Senha não encontrada"
);
}
}
} else {
JOptionPane.showMessageDialog(
login,"Senha não encontrada.");
}
}
}
mas na hora de validar a senha Usuarios.getUsuarios().get(usr).equals(snh)
ele não valida.
Alguém pode me dar uma força aqui?
Agradecido
Lucas Ribeiro
Pelo que percebi, a String snh não está criptografada então sempre serão senhas diferentes.
Faça um teste nesse método:
public static Map<String,String> getUsuarios() {
usuarios.put("root",DigestUtils.sha256Hex("senha0"));
usuarios.put("paulo",DigestUtils.sha256Hex("senha1"));
usuarios.put("maria",DigestUtils.sha256Hex("senha2"));
usuarios.put("alguém",DigestUtils.sha256Hex("senha3"));
return usuarios;
}
Retire todos os DigestUtils.sha256Hex("") e deixe apenas “string pura”.
Se funcionar então você terá de criptografar a senha como falei para fazer as comparações.
mas aí a senha ficaria desprotegida de engenharia reversa.
Lhe agradeço pela informação, mas não há outro jeito?
[quote=lucasribeiro]mas aí a senha ficaria desprotegida de engenharia reversa.
Lhe agradeço pela informação, mas não há outro jeito?[/quote]
É apenas para teste, se depois que você desproteger a senha ele conseguir entrar, você vai saber que é sobre a criptografia, daí você volta o que estava antes e criptografa a senha que está passando para testar.
Além do mais, sobre estar desprotegida, o formato de criptografia que você está usando (sha256) é de “mão dupla” (possível de descriptografar) facilita isso, geralmente usa-se formato md5 (esse é mão única, teoricamente não há reversão).
Puxa! Obrigado pela informação… Isso é importante!
Tá valendo, vou fazer isso. Achei que era para descartar a criptografia, perdão.
[quote=lucasribeiro]Puxa! Obrigado pela informação… Isso é importante!
Tá valendo, vou fazer isso. Achei que era para descartar a criptografia, perdão.[/quote]
Descartar? Nem pensar, hoje em dia com a criptografia já está difícil deixar um sistema seguro, imagine sem usar.
O fato é saber usar um hash que seja difícil de quebrar e como havia dito antes o sha256 facilita mais que o md5 justamente por ser de “mão dupla”.
Valeu, soldiersx13…
Deu certo com o sha256Hex… Agora vou para a mão única. Seria “shaMd5” sem o “Hex”?
Amigo, o cálculo da criptografia é diferente para cada acesso ao software?
Pronto! Md5 aplicado. Sistema funcionando… Valeu
[quote=lucasribeiro]Valeu, soldiersx13…
Deu certo com o sha256Hex… Agora vou para a mão única. Seria “shaMd5” sem o “Hex”?
[/quote]
O “Hex” é uma abreviação de Hexadecimal, ou seja, aumenta a dificuldade em quebrar o hash gerado pois utiliza além dos 10 dígitos comuns (0-9), usa também os códigos de A-F (representando o range de 10 até 15).
Isso você diz com md5 ou sha256? Se for md5, sinceramente eu não sei como o Java se comporta, pois nunca utilizei, mas em php o md5 gera sempre uma chave diferente, daí a comparação é feita pelo sistema comparando as chaves (senhas) para saber se são próximas e assim liberar o acesso, creio eu ser um comportamento padrão da criptografia.
Se você puder compartilhar o trecho de código que você fez (apenas da parte de criptografia e comparação de senhas), assim quem tiver a mesma dúvida que você nem precisa postar outro tópico.
Também uma última dica, se o tópico foi resolvido, é bom editar título do seu primeiro post incluindo um [Resolvido], assim o pessoal do fórum já sabe da situação.
É verdade soldierx13,
e aqui vai…
Enfim, o código ficou assim:
- na classe Gerente
public static void validar(String usr, String snh){
String snh1 = DigestUtils.md5Hex(snh);
if(usr.isEmpty()){
JOptionPane.showMessageDialog(login, "Usuário vazio.");
Login.ftfUsuario.grabFocus();
} else {
if(Usuarios.getUsuarios().containsKey(usr)){
if(snh.isEmpty()){
JOptionPane.showMessageDialog(
login,"O campo \"senha\" está vazio.");
}else {
if(Usuarios.getUsuarios().get(usr).equals(snh1)){
registros = new Registros();
registros.setVisible(true);
login.setVisible(false);
} else {
JOptionPane.showMessageDialog(
login, "Senha não encontrada"
);
}
}
} else {
JOptionPane.showMessageDialog(
login,"Senha não encontrada."
);
}
}
}
onde o método validar criptografa a String snh em md5, e armazena na String snh1 String snh1 = DigestUtils.md5Hex(snh);
e a validação é feita na condição do if da linha 12 Usuarios.getUsuarios().get(usr).equals(snh1)
onde o JFrame principal Registros é instanciado e exbido, junto à ocultação do JDialog Login…
Já a classe Usuários, onde o método validar(String usr, String snh) buscará os usuário e senha digitados, contém um objeto map<> encapsulado e não contém construtor… [code]import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.digest.*;
public class Usuarios {
static Map<String,String> usuarios = new HashMap<String,String>();
static String usuario;
String senha;
public static Map<String,String> getUsuarios() {
usuarios.put("root",DigestUtils.md5Hex("senha0"));
usuarios.put("paulo",DigestUtils.md5Hex("senha1"));
usuarios.put("maria",DigestUtils.md5Hex("senha2"));
usuarios.put("alguém",DigestUtils.md5Hex("senha3"));
return usuarios;
}
public void setUsuarios(Map<String,String> usuarios) {
Usuarios.usuarios = usuarios;
}
}[/code] E, assim, viveram todos felizes para sempre…
Valeu galera