Gerir passwords

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 !

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…

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

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 ?

Trate como String, armazene como String no banco.

Vejo a artigo abaixo deve esclarecer suas dúvidas.

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

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 !

[quote=LuisClaudio]
Voce pode me dizer o que pode estar acontecendo ?
Obrigado ! [/quote]

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.

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 ?