Criptografia em Java - Ajuda rápida

Boa tarde, amigos do fórum.

Venho estudando e pesquisando algumas coisas sobre criptografia em Java.Eu sempre trabalhei com o MD5, mas o meu requisito agora é justamente a necessidade de descriptografar minhas senhas.

Bem, após umas pesquisas no fórum e pela internet afora, me pareceu que usar uma criptografia baseada em PBE seria o que melhor me atenderia.Encontrei aqui no Guj mesmo esse codigo que o Thingol postou

package com.teste;

import javax.crypto.*;   
import javax.crypto.spec.*;   
import java.security.*;   
import java.security.InvalidKeyException;   
import java.security.NoSuchAlgorithmException;   
import java.security.spec.KeySpec;   
import sun.misc.BASE64Encoder; // para simplificar o exemplo. Use alguma outra classe para converter   
import sun.misc.BASE64Decoder; // para Base-64.

public class TesteCripto {
	   
    private static SecretKey skey;   
    private static KeySpec ks;   
    private static PBEParameterSpec ps;   
    private static final String algorithm = "PBEWithMD5AndDES";   
    private static BASE64Encoder enc = new BASE64Encoder();   
    private static BASE64Decoder dec = new BASE64Decoder();   
    static {   
        try {   
            SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);   
            ps = new PBEParameterSpec (new byte[]{3,1,4,1,5,9,2,6}, 20);   
  
            ks = new PBEKeySpec ("EAlGeEen3/m8/YkO".toCharArray()); // esta é a chave que você quer manter secreta.   
            // Obviamente quando você for implantar na sua empresa, use alguma outra coisa - por exemplo,   
            // "05Bc5hswRWpwp1sew+MSoHcj28rQ0MK8". Nao use caracteres especiais (como ç) para nao dar problemas.   
            
            skey = skf.generateSecret (ks);   
        } catch (java.security.NoSuchAlgorithmException ex) {   
            ex.printStackTrace();   
        } catch (java.security.spec.InvalidKeySpecException ex) {   
            ex.printStackTrace();   
        }   
    }   
    public static final String encrypt(final String text)   
        throws   
        BadPaddingException,   
        NoSuchPaddingException,   
        IllegalBlockSizeException,   
        InvalidKeyException,   
        NoSuchAlgorithmException,   
        InvalidAlgorithmParameterException {   
               
        final Cipher cipher = Cipher.getInstance(algorithm);   
        cipher.init(Cipher.ENCRYPT_MODE, skey, ps);   
        return enc.encode (cipher.doFinal(text.getBytes()));   
    }   
    public static final String decrypt(final String text)   
        throws   
        BadPaddingException,   
        NoSuchPaddingException,   
        IllegalBlockSizeException,   
        InvalidKeyException,   
        NoSuchAlgorithmException,   
        InvalidAlgorithmParameterException {   
               
        final Cipher cipher = Cipher.getInstance(algorithm);   
        cipher.init(Cipher.DECRYPT_MODE, skey, ps);   
        String ret = null;   
        try {   
            ret = new String(cipher.doFinal(dec.decodeBuffer (text)));   
        } catch (Exception ex) {   
        }   
        return ret;   
    }   
	public static void main(String[] args) throws Exception {   
	    String password = "TESTESENHA"; // esta é a tal senha do banco de dados que você quer criptografar   
	    String encoded = TesteCripto.encrypt (password);   
	    System.out.println (encoded);  // imprime "4fWCjTdEhMPEluqE2n8ci4FiqWeb+DXc"   
	    System.out.println (TesteCripto.decrypt (encoded).equals (password)); // imprime "true"   
	    // Vamos alterar um caracter, só para ver o que ocorre   
	    char[] enc = encoded.toCharArray();   
	    enc[2] = (char) (enc[2] + 1);   
	    encoded = new String (enc);   
	    System.out.println (encoded); // imprime "4fXCjTdEhMPEluqE2n8ci4FiqWeb+DXc"   
	    System.out.println (password.equals (TesteCripto.decrypt (encoded))); // imprime "false"   
	}   
	  
}

Agora, a dúvida que conto com a colaboração de voces :stuck_out_tongue:

ks = new PBEKeySpec ("EAlGeEen3/m8/YkO".toCharArray()); 

Compreendo que essa é a chave secreta que utilizarei nas minhas criptografias.Evidentemente, como isso é um exemplo, o proprio Thingol recomenda alterar esse literal. Mas altero PARA O QUE?

Qual é a regra de geração dessa String, amigos?

Obrigado!

Ah, essa tal string ("EAlGeEen3/m8/YkO" é a senha (Password) que você quer transformar em uma chave, usada no PBE (Password-Based Encryption).
Pode mudar para qualquer coisa.

Eu, por exemplo, usei o openssl para gerar essa string, com o seguinte comando:

openssl rand -base64 15

Um exemplo dessa saída:

C> \openssl\bin\openssl rand -base64 15
Loading 'screen' into random state - done
xLrgSqwOHjXzW2qtGjk1

Isso dá 15 * 8 = 120 bits aleatórios, o que é mais que suficiente para uma chave.

Se quiser usar o PBE com um algoritmo que precise de mais bits de chave (como o AES-256), você precisa de uma senha maior.

C> \openssl\bin\openssl rand -base64 32
Loading 'screen' into random state - done
+sc613sJ+kMT3ZFVAFWdC/SaLxlPfMa3Av6vSnb8j08=

Certo…entendi!Obrigado amigo!! :wink: