[RESOLVIDO] Não quer validar a senha

10 respostas
L
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
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;
	}
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

10 Respostas

S

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&lt;String,String&gt; 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.

L

mas aí a senha ficaria desprotegida de engenharia reversa.
Lhe agradeço pela informação, mas não há outro jeito?

S

lucasribeiro:
mas aí a senha ficaria desprotegida de engenharia reversa.
Lhe agradeço pela informação, mas não há outro jeito?

É 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).

L

Puxa! Obrigado pela informação… Isso é importante!
Tá valendo, vou fazer isso. Achei que era para descartar a criptografia, perdão.

S

lucasribeiro:
Puxa! Obrigado pela informação… Isso é importante!
Tá valendo, vou fazer isso. Achei que era para descartar a criptografia, perdão.

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”.

L

Valeu, soldiersx13…

Deu certo com o sha256Hex… Agora vou para a mão única. Seria “shaMd5” sem o “Hex”?

L

Amigo, o cálculo da criptografia é diferente para cada acesso ao software?

L

Pronto! Md5 aplicado. Sistema funcionando… Valeu

S

lucasribeiro:
Valeu, soldiersx13…

Deu certo com o sha256Hex… Agora vou para a mão única. Seria “shaMd5” sem o “Hex”?

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.

L

É 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...
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;
	}
	
}
E, assim, viveram todos felizes para sempre...

Valeu galera

Criado 17 de outubro de 2013
Ultima resposta 18 de out. de 2013
Respostas 10
Participantes 2