Até ai blz… era mais o menos oq eu precisava… só que surgiu uma dúvida.
Tipo no sistema aqui tem uma parte que eu tenho que reenviar a senha do usuario por email…
Com a senha criptografada no banco… como eu faço pra transformar ela na senha real pra poder enviar pro Usuario???
recupere a senha do banco e use o método decode antes de enviar ao usuário
davidbuzatto
Uma outra opção, seria vc criar uma nova senha, salvar a versão criptografada da nova senha no banco e enviar a versão criada para o usuário.
Ai ele loga no sistema e muda a senha de novo.
Ai vc não precisa enviar a senha salva no banco nem se preocupar com o decode.
[]´s
aeciovc
lembrando só que o algoritmo MD5 é um algoritmo de Hash, ou seja, ele não tem volta. pra que vc reenvie a senha pro usuário só criando outra!
E
entanglement
Usar só o MD5, sem incluir mais alguma informação que é diferente para cada usuário, não é adequado. Uma auditoria em uma empresa que trabalhei revelou que muitos usuários tinham senhas simples ou então a mesmíssima senha, só de verificar que o algoritmo para o determinado sistema era MD5.
colored
Tipo… Eu Achei uma Classe aki No Forum…
packageUnimed.Teste;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjavax.crypto.*;importjavax.crypto.spec.*;importjava.security.*;importjava.security.spec.*;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;importjava.security.spec.KeySpec;importsun.misc.BASE64Encoder;// para simplificar o exemplo. Use alguma outra classe para converter importsun.misc.BASE64Decoder;// para Base-64. publicfinalclassTeste{/** A chave secreta */privateSecretKeyskey;/** A especificação da chave */privateKeySpecks;/** Parâmetros passados para converter uma senha em uma chave */privatePBEParameterSpecps;// Nome do algoritmo usado - veja em PKCS#5, ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf privatefinalStringalgorithm="PBEWithMD5AndDES";privateBASE64Encoderenc=newBASE64Encoder();privateBASE64Decoderdec=newBASE64Decoder();privatevoidconvertPasswordToKey(finalStringpassword){try{// Obtendo uma instância da fábrica de chaves secretas. // O algoritmo dessa fábrica, chamado PBEWithMD5AndDES, // transforma uma senha (conjunto de caracteres digitáveis) // em uma chave (bits aleatórios que devem ser mantidos em sigilo). // Essa chave é gerada segundo um algoritmo especificado em: // PKCS#5 - disponível em: ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf SecretKeyFactoryskf=SecretKeyFactory.getInstance(algorithm);// Um dos parâmetros necessários para gerar a senha a partir da chave é um // "salt" (que neste caso especifiquei como uma série de bytes que // são a representação decimal dos primeiros dígitos de pi) e // um "iteration count". ps=newPBEParameterSpec(newbyte[]{3,1,4,1,5,9,2,6},20);// Aqui temos a senha... ks=newPBEKeySpec(password.toCharArray());// E aqui temos o resultado final, que é a chave secreta. skey=skf.generateSecret(ks);}catch(java.security.NoSuchAlgorithmExceptionex){ex.printStackTrace();}catch(java.security.spec.InvalidKeySpecExceptionex){ex.printStackTrace();}}/** * Cifra um texto com a senha passada. */publicfinalStringencrypt(finalStringpassword,finalStringtext)throwsBadPaddingException,NoSuchPaddingException,IllegalBlockSizeException,InvalidKeyException,NoSuchAlgorithmException,InvalidAlgorithmParameterException{// Converte a senha em uma chave convertPasswordToKey(password);// Obtém o algoritmo de criptografia (no caso DES) finalCiphercipher=Cipher.getInstance(algorithm);// Inicializa o algoritmo com a chave cipher.init(Cipher.ENCRYPT_MODE,skey,ps);// Efetua a criptografia, usando "doFinal", e converte para Base-64 returnenc.encode(cipher.doFinal(text.getBytes()));}/** * Decifra um texto com a senha passada */publicfinalStringdecrypt(finalStringpassword,finalStringtext)throwsBadPaddingException,NoSuchPaddingException,IllegalBlockSizeException,InvalidKeyException,NoSuchAlgorithmException,InvalidAlgorithmParameterException{// Converte a senha em uma chave convertPasswordToKey(password);// Obtém o algoritmo de criptografia (no caso DES) finalCiphercipher=Cipher.getInstance(algorithm);// Inicializa o algoritmo com a chave cipher.init(Cipher.DECRYPT_MODE,skey,ps);Stringret=null;try{// Converte de Base-64 para bytes, e então efetua a decifração ("descriptografia"). ret=newString(cipher.doFinal(dec.decodeBuffer(text)));}catch(Exceptionex){}returnret;}publicstaticvoidmain(String[]args)throwsException{Stringpassword="Jefferson 2";Stringcleartext="Texto Clear";System.out.println("Texto original em claro");System.out.println(cleartext);Stringencrypted=newTeste().encrypt(password,cleartext);System.out.println("Texto criptografado");System.out.println(encrypted);Stringdecrypted=newTeste().decrypt(password,encrypted);System.out.println("Texto decifrado");System.out.println(decrypted);System.out.println("O texto original e o decifrado "+(cleartext.equals(decrypted)?" batem":" não batem"));}}
Voltando a Ajuda… Tipo Que nem o amigo disse pra eu guardar A Senha Criptografada em Outro Campo… mas ai então acho q nem rola… de qqr jeito a senha original vai estar lá…
Será q eh realmente vantajoso criptografar essa senha?
packageUnimed.Teste;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjavax.crypto.*;importjavax.crypto.spec.*;importjava.security.*;importjava.security.spec.*;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;importjava.security.spec.KeySpec;importsun.misc.BASE64Encoder;// para simplificar o exemplo. Use alguma outra classe para converter importsun.misc.BASE64Decoder;// para Base-64. publicfinalclassTeste{/** A chave secreta */privateSecretKeyskey;/** A especificação da chave */privateKeySpecks;/** Parâmetros passados para converter uma senha em uma chave */privatePBEParameterSpecps;// Nome do algoritmo usado - veja em PKCS#5, ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf privatefinalStringalgorithm="PBEWithMD5AndDES";privateBASE64Encoderenc=newBASE64Encoder();privateBASE64Decoderdec=newBASE64Decoder();privatevoidconvertPasswordToKey(finalStringpassword){try{// Obtendo uma instância da fábrica de chaves secretas. // O algoritmo dessa fábrica, chamado PBEWithMD5AndDES, // transforma uma senha (conjunto de caracteres digitáveis) // em uma chave (bits aleatórios que devem ser mantidos em sigilo). // Essa chave é gerada segundo um algoritmo especificado em: // PKCS#5 - disponível em: ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf SecretKeyFactoryskf=SecretKeyFactory.getInstance(algorithm);// Um dos parâmetros necessários para gerar a senha a partir da chave é um // "salt" (que neste caso especifiquei como uma série de bytes que // são a representação decimal dos primeiros dígitos de pi) e // um "iteration count". ps=newPBEParameterSpec(newbyte[]{3,1,4,1,5,9,2,6},20);// Aqui temos a senha... ks=newPBEKeySpec(password.toCharArray());// E aqui temos o resultado final, que é a chave secreta. skey=skf.generateSecret(ks);}catch(java.security.NoSuchAlgorithmExceptionex){ex.printStackTrace();}catch(java.security.spec.InvalidKeySpecExceptionex){ex.printStackTrace();}}/** * Cifra um texto com a senha passada. */publicfinalStringencrypt(finalStringpassword,finalStringtext)throwsBadPaddingException,NoSuchPaddingException,IllegalBlockSizeException,InvalidKeyException,NoSuchAlgorithmException,InvalidAlgorithmParameterException{// Converte a senha em uma chave convertPasswordToKey(password);// Obtém o algoritmo de criptografia (no caso DES) finalCiphercipher=Cipher.getInstance(algorithm);// Inicializa o algoritmo com a chave cipher.init(Cipher.ENCRYPT_MODE,skey,ps);// Efetua a criptografia, usando "doFinal", e converte para Base-64 returnenc.encode(cipher.doFinal(text.getBytes()));}/** * Decifra um texto com a senha passada */publicfinalStringdecrypt(finalStringpassword,finalStringtext)throwsBadPaddingException,NoSuchPaddingException,IllegalBlockSizeException,InvalidKeyException,NoSuchAlgorithmException,InvalidAlgorithmParameterException{// Converte a senha em uma chave convertPasswordToKey(password);// Obtém o algoritmo de criptografia (no caso DES) finalCiphercipher=Cipher.getInstance(algorithm);// Inicializa o algoritmo com a chave cipher.init(Cipher.DECRYPT_MODE,skey,ps);Stringret=null;try{// Converte de Base-64 para bytes, e então efetua a decifração ("descriptografia"). ret=newString(cipher.doFinal(dec.decodeBuffer(text)));}catch(Exceptionex){}returnret;}publicstaticvoidmain(String[]args)throwsException{Stringpassword="Jefferson 2";Stringcleartext="Texto Clear";System.out.println("Texto original em claro");System.out.println(cleartext);Stringencrypted=newTeste().encrypt(password,cleartext);System.out.println("Texto criptografado");System.out.println(encrypted);Stringdecrypted=newTeste().decrypt(password,encrypted);System.out.println("Texto decifrado");System.out.println(decrypted);System.out.println("O texto original e o decifrado "+(cleartext.equals(decrypted)?" batem":" não batem"));}}
Voltando a Ajuda… Tipo Que nem o amigo disse pra eu guardar A Senha Criptografada em Outro Campo… mas ai então acho q nem rola… de qqr jeito a senha original vai estar lá…
Será q eh realmente vantajoso criptografar essa senha?
Depende do nível de segurança você precisa dar… Caso você não use criptografia, qualquer um que acessar o banco vai ver as senhas abertas…
Se você realmente precisa devolver a senha decriptografada, então vai precisar usar o 2o. algoritmo e ter uma senha “master” para fazer a encriptação e decriptação.
O mais seguro seria fazer como o pessoal falou antes, gerar uma nova senha (aleatória) e pedir para o usuário se logar e mudar a senha. Provavelmente você precisa da senha original caso o usuário tenha pedido para reiniciar a senha sem querer (ou alguém mal intencionado forçou o reset).