Gerir passwords

7 respostas
L

Ola pessoal,

Preciso criar um mecanismo para gerar passwords. Ou seja o cliente é cadastrado e lhe é dados uma password. a password terá de ter apenas 4 digitos e terão de ser apenas numéricos.

As minhas perguntas são :
1- ha alguma API open source que me possa oferecer ja estes metodos ?
2- como posso especificar na minha base de dados que se trata-se um campo para password ? gostaria de ocultar este campo( base dados mysql )
3- quando o cliente introduzir a sua passowrd como posso valida-la ?

Alguem me pode ajudar com este tema ?

Obrigado desde ja !

7 Respostas

lvieira

respondendo suas perguntas

se vc quer gerar uma senha numérica de 4 dígitos o método random() da classe Math já te ajuda (só gerar senhas entre 1 e 9999)

devo observar que senhas apenas numéricas com esse tamanho são extremamente frágeis…

imagino que a técnica segura mais comum seja gravar o hash MD5 da senha no banco (com o tipo varchar mesmo)
na hora de comparar a senha vc gera o hash da senha que o usuário digita, e compara hash com hash…
aqui vc encontra todas informações que precisa para fazer isto.

um jeito seguro o suficiente, como explicado acima, é transformar a senha digitada em hash.
traga o hash da senha cadastrada para aquele usuário no banco e compare com o hash da senha digitada…

uma boa dica de segurança é devolver mensagens de erros genéricas para o usuário, do tipo: senha ou usuário inválido…

nunca diga que o usuário existe mas a senha tá errada, ou que o usuário não existe na base…

bem… imagino que tudo que vc precisa está dentro do “pacote padrão” do java, sem necessidade de api de terceiros…

L

Ola lvieira,

deu tudo certo mas estou com a seguinte duvida, se eu cadastrar o hash MD5 da senha no banco, depois com vou apaha-la novamente. vou tratar ela como que ? String ou outro ? eu gravei o hash MD5 da senha em um file, mas ai quando eu fui buscar outra vrez para comparar com outro hash nao deu certo .
veja :

public static MessageDigest md;
...
 try {
          md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }

      md.update(fraseGuardada.getBytes());
      byte[] hashMd5 = md.digest();

      md.update(fraseDigitada.getBytes());
      byte[] hashMd6 = frase12.getBytes();

 if (md.isEqual(hashMd5, hashMd6)){
          System.out.println("Login com sucesso ");
      }else{
          System.out.println("Esta senha é inválida");
      }

o metodo diz que as senha nao sao iguais .

Pode me dizer o que pode estar passando ?

Obrigado

L

A pergunta seria :

Como é que eu recupero um hash que foi salvo e comparo com outro hash que foi recentemente criado.

Como crio um objecto hash apartir de um objecto guardado ?

bombbr

Trate como String, armazene como String no banco.

Vejo a artigo abaixo deve esclarecer suas dúvidas.

http://javafree.uol.com.br/artigo/871490/

L

dessa forma nao ta funcionando ?

O que voce sugere é que eu compare as duas como se fossem strings ?

A minha duvida é quando tento comparar a senha guardada com a fornecida elas nunca sao iguais.

estou a compara da seguinte forma :

public static MessageDigest md;
....

        try {
           md = MessageDigest.getInstance("MD5");
        } catch (Exception ex) {
            ex.printStackTrace();
        }

      md.update(senhaIntroduzida.getBytes());
      byte[] hashMd56 = md.digest();


      byte[] hashMd6 = senhaGuardadaNoBanco.getBytes();

//Aqui ele vai comparar a senha fornecida com a senha que esta guardada no banco    
 if (md.isEqual(hashMd5, hashMd6)){
          System.out.println("Login com sucesso ");
      }else{
          System.out.println("Esta senha é inválida");
      }

mesmo que as senhas estejam correctas ele sempre me diz que as senhas nao sao iguais

Voce pode me dizer o que pode estar acontecendo ?

Obrigado !

bombbr

LuisClaudio:

Voce pode me dizer o que pode estar acontecendo ?
Obrigado !

Veja no exemplo do link que postei é utilizado um encoder (BASE64Encoder). Isto é feito para transformar um array de bytes em uma String legível (codificada com Base 64).
Acho que é isto que esta faltando.

L

por favor de uma olhadinha no meu code e ve por que acha que ta dando errado :

package testes;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;

public class encriptar {
public static MessageDigest md;
public static String frase = "Ola Luis";
public static String frase1 = "[B@9304b1";
public static byte[] hashMd5;
public static byte[] hashMd6;



    public static String encripta (String senha) {
        MessageDigest digest;
        String senha2 = "Dz5V1lGQEkT9/CWc6Pj4CA=="; // eu defini assim porque é assim que ela aparece quando eu imprimo

        try {
                 digest = MessageDigest.getInstance("MD5");
                 digest.update(senha.getBytes());
                 BASE64Encoder encoder = new BASE64Encoder ();

                 // Aqui imprime a senha fornecida ja incriptada
                 System.out.println(encoder.encode (digest.digest ()));

          hashMd5 = encoder.encode (digest.digest ()).getBytes();
          hashMd6 = senha2.getBytes();
                      
           if (digest.isEqual(hashMd5, hashMd6)){
           System.out.println("Login com sucesso ");
           }else{
           System.out.println("Esta senha é inválida");
           }


            return encoder.encode (digest.digest ());

            } catch (NoSuchAlgorithmException ns) {
                 ns.printStackTrace ();
                 return senha;
            }

       }

     public static void main(String[] args) {

         encripta("luis claudio");

     }

}

o resultado é sempre :

Dz5V1lGQEkT9/CWc6Pj4CA==
Esta senha é inválida

o que pode estar mal aqui ?

Criado 8 de janeiro de 2010
Ultima resposta 9 de jan. de 2010
Respostas 7
Participantes 3