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 ?
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…
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 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
[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.