Segurança do login

Bons dias, colegas…

Estou criando uma aplicação para gerência de informações de consultório médico, e criei um sistema de login. O problema é que usei os conceitos básicos do java, com direito a usuário armazenado em matriz de strings e usuários[i].contains(“usuário digitado”) dentro de loop for: sem nenhuma segurança. Um processo de engenharia reversa acessaria a matriz dos usuários dando risada.

Alguém pode me ajudar?

Agradecido
Lucas Ribeiro

Cara isso vai depender de como os seus usuário estão armazenados.
Se você ta carregando seus usuário para a memória em um array, você pode fazer com um Map<K, V>
Um exemplo poderia ser:

Map&lt;String, String&gt; usuarios = new HashMap&lt;String, String&gt;();
usuarios.put("jose", DigestUtils.sha256Hex("abc123"));
usuarios.put("paulo", DigestUtils.sha256Hex("a1b2c3"));
usuarios.put("maria", DigestUtils.sha256Hex("@85#ab"));
	
/* usuário e senha digitados */	
String usuario = "jose";
String senha = DigestUtils.sha256Hex("abc123");
		
if (usuarios.containsKey(usuario)) {
	if (usuarios.get(usuario).equals(senha)) {
		System.out.println("Usuário válido!");
	} else {
		System.out.println("Senha inválida!");
	}
} else {
	System.out.println("Usuário não encontrado!");
}
/**
DigestUtils.sha256Hex vem da biblioteca commons-codec da apache
*/

Amigo,
qual o pacote desta classe? E…
Dada tua experiência, devo concluir que tal método put("maria", DigestUtils.sha256Hex("@85#ab")); está imune a decodificadores por engenharia reversa. Sim?
Parece que isso resolve. Como posso proteger meu sistema de outros métodos de violação? Há?
De qualquer modo, tá valendo.

[quote=lucasribeiro]
qual o pacote desta classe? E…[/quote]

Em: org.apache.commons.codec.digest
http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html

[quote=lucasribeiro]
Dada tua experiência, devo concluir que tal método

put("maria", DigestUtils.sha256Hex("@85#ab"));

está imune a decodificadores por engenharia reversa. Sim?[/quote]

O texto @85#ab é a senha digitada pelo usuário o método sha256Hex de acordo com o javadoc faz o seguinte “Calculates the SHA-256 digest and returns the value as a hex string.”
acho pouco provável que alguém queira fazer engenharia reversa disso.

[quote=lucasribeiro]Bons dias, colegas…

Estou criando uma aplicação para gerência de informações de consultório médico, e criei um sistema de login. O problema é que usei os conceitos básicos do java, com direito a usuário armazenado em matriz de strings e usuários[i].contains(“usuário digitado”) dentro de loop for: sem nenhuma segurança. Um processo de engenharia reversa acessaria a matriz dos usuários dando risada.

Alguém pode me ajudar?

Agradecido
Lucas Ribeiro[/quote]

Sem querer ser agressivo, usuário armazenado em matriz é muito bisonho, embarque um bd na aplicação ou coloque isso em um xml, pelo menos fica bem melhor.

Jweibe, se achar pergunta demais e não quiser responder, eu compreendo, rsrs.

Mas, essa classe oferece suporte a adição e edição de contas de usuário? Ou felizmente posso criar os mecanismos sozinho?
Tenho um pouco de dificuldades em decifrar a linguagem da documentação. Mas, e a biblioteca javax.auth, que dizeis?
Parece que postar no fórum “Java Avançado” seria presunção, mas não li a bula: “Java Básico” seria o correto?
Não encontrei a biblioteca commons-codec. Baixo pelo site da Apache?

Cara, só de ler já te agradeço…

Amigo alcionj, parece um erro de interpretação, você não está sendo agressivo, está sentindo que eu postei estas palavras justamente porque meus métodos estão bisonhos e eu gostaria de melhorá-los. Mas agradeço pela educação e cortesia da elucidação.

Para todos os efeitos, agradeço muitíssimo a cooperação…

Vamos la, essa classe DigestUtils e uma classe utilitária que contém vários métodos que te auxiliam na criptografia de dados.

Você deve criar seu próprio mecanismo de armazenamento de usuários, seja ele em arquivo txt, json, xml ou db.
Você poderia fazer algo parecido em xml:

&lt;users&gt;
  &lt;user&gt;
    &lt;username&gt;jose&lt;/username&gt;
    &lt;password&gt;d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f&lt;/password&gt;
  &lt;/user&gt;
  &lt;user&gt;
    &lt;username&gt;paulo&lt;/username&gt;
    &lt;password&gt;d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f&lt;/password&gt;
  &lt;/user&gt;
&lt;/users&gt;

você pode usar jdom2 ou simple-xml para parsear seu xml.
Para download do commons-codec: http://ftp.unicamp.br/pub/apache//commons/codec/binaries/commons-codec-1.8-bin.zip

Desculpe jweibe,

acho que deixei passar alguma coisa:

  • eu inseri o código que você postou no fonte da aplicação, com o import “org.apache.commons.codec.digest”;
  • baixei o pacote para a pasta do projeto e o descompactei;
  • uso eclipse kepler e adicionei no build path apenas as jars,
    pois não entendo acerca dos tipos de biblioteca que ele fornece para minha opção em “Add Library” e resolvi chutar;
  • determinei a localização das fontes dos paths das 5 jars que adicionei…

E ainda continuo recebendo alguns palavrões: Multiple markers at this line - Syntax error on tokens, AnnotationName expected instead - Syntax error, insert "Type VariableDeclaratorId" to complete FormalParameter - Syntax error on token ""jose"", invalid FormalParameterList - Syntax error on token(s), misplaced construct(s) Entretanto, peço que solicite o código, pois o post ficaria mais longo do que parece convir…

De qualquer modo, agradeço…

Consegui,

eu me esqueci de colocar o código no construtor… Coisa de iniciante.
Agora vou fazer as adaptações de acordo com o que aprendi.
Se quiser eu lhe aviso quando der certo.

Obrigado

jweibe, você pode me falar um pouco sobre isso?