Criptografar o arquivo persistence.xml

Olá pessoal, ultimamente tenho estudado um pouco de como utilizar JPA+hibernate, e para brincar um pouco fiz um programinha simples de cadastro de clientes. Quando terminei notei que o arquivo .jar que é gerado contém dentro da pasta META-INF o arquivo persistence.xml no qual esta contida a senha do meu banco de dados. Ou seja, caso eu fosse distribuir meu programinha, qualquer um poderia pegar o jar e ver minha senha :shock: !
Então minha dúvida é: como que eu faço para que não fique exposta minha senha do banco? tem como criptografar este arquivo?

Desde já agradeço !!!

Alguém ?

Já tentou apagar essa informação?

Não posso, se eu apagar esta informação não irá funcionar o meu sistema, pois ele busca neste arquivo o endereço do banco de dados assim como o usuario e a senha para acesso.
Mas mesmo assim obrigado…

Cara, até onde eu sei sobre meta-inf ela é gerada automaticamente e o manifest era para dependência de jar. Foi vc qm colocou a senha ali?

Realmente essa senha terá que ficar em algum lugar. Uma solução seria criar um arquivo onde vc armazenaria sua senha e quando vc enviasse seu programa para alguém, esse arquivo fosse em branco e a pessoa colocasse a senha/usuário do DB dela. Com isso, sua senha não seria exposta.

Realmente o meta-inf é gerado automaticamente, mas minha senha fica dentro do arquivo persistence.xml que é o arquivo de configuração do hibernate e não no arquivo mainfest.

Isso não resolve pro meu caso, é porque aqui onde eu faço meu estágio tem vários pcs, e eu quero colocar o meu programa em todos eles, e colocar o meu BD no servidor, so que ai que vem o problema, em todos os pcs terá o meu jar, e dentro dele tem o arquivo persistence.xml que terá o endereço do BD, usuario e senha, ai caso alguem queira ele pode muito bem ver meu usuario e senha, e então acessar o meu BD e então só Deus sabe o que ele pode querer fazer… :shock:

Você pode colocar só a senha criptgrafada, já é o suficiente. Podes criar um SHA, MD5 ou whatever.

Qual a implementação de JPA você está utilizando?

Estou utilizando o hibernate.
E quanto a eu criptografar a senha… como faço isso? :smiley:
eu até tenho um método aqui que criptografa uma senha, mas ai eu coloco a senha criptografada no arquivo persistence.xml? mas e quando o hibernate for ler o arquivo e ver essa senha criptografada? ele vai descriptografar e mandar para o banco para realizar o acesso?

Normalmente, pra contornar esse problema, usamos um datasource (que é gerenciado pelo contêiner, ou seja, o desenvolvedor não tem acesso) e fazemos o lookup dele por JNDI. Fica assim:

persistence.xml



<persistence-unit name="PU">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/PUDatasource</jta-data-source>
   
    <!-- outras informações... -->

    <properties>
      <property name="hibernate.dialect" value="ODialeto" />
      <property name="hibernate.hbm2ddl.auto" value="update" />
      <property name="hibernate.show_sql" value="false" />
      <property name="hibernate.format_sql" value="true" />

      <!-- etc... -->

    </properties>

</persistence-unit>

De maneira que as informações de conexão com o banco fiquem no datasource, OK ?

[]´s

hum… só tem um problema… não faço idéia de como fazer isso. rsrsrs
mas valeu pela dica, vou pesquisar sobre esse datasource, qualquer coisa volto aqui.

Olá asaudate, dei uma pesquisada na web e achei algumas coisas falando sobre JNDI, porém todas são voltadas para aplicações web, e minha aplicação é para desktop. Como que irei trabalhar com um contêiner(Tomcat) utilizando java para Desktop ?

flw

http://www.jasypt.org/

Olá Garcia, será que tem como vc me mostrar um exemplo? não to conseguindo entender como que irei utilizar este jasypt.
Não estou sabendo como configurar meu arquivo persistence.xml.

Obrigado.

Eu sei q esse post já tem 2 anos, mas pra quem quiser cryptograr uma string fica a dica


public class Base64Coder
{

    public static String encodeString(String s)
    {
        return new String(encode(s.getBytes()));
    }

    public static char[] encode(byte in[])
    {
        return encode(in, in.length);
    }

    private static char[] encode(byte in[], int iLen)
    {
        int oDataLen = (iLen * 4 + 2) / 3;
        int oLen = ((iLen + 2) / 3) * 4;
        char out[] = new char[oLen];
        int ip = 0;
        for(int op = 0; ip < iLen; op++)
        {
            int i0 = in[ip++] & 0xff;
            int i1 = ip >= iLen ? 0 : in[ip++] & 0xff;
            int i2 = ip >= iLen ? 0 : in[ip++] & 0xff;
            int o0 = i0 >>> 2;
            int o1 = (i0 & 3) << 4 | i1 >>> 4;
            int o2 = (i1 & 0xf) << 2 | i2 >>> 6;
            int o3 = i2 & 0x3f;
            out[op++] = map1[o0];
            out[op++] = map1[o1];
            out[op] = op >= oDataLen ? '=' : map1[o2];
            op++;
            out[op] = op >= oDataLen ? '=' : map1[o3];
        }

        return out;
    }

    public static String decodeString(String s)
    {
        return new String(decode(s));
    }

    public static byte[] decode(String s)
    {
        return decode(s.toCharArray());
    }

    private static byte[] decode(char in[])
    {
        int iLen = in.length;
        if(iLen % 4 != 0)
            return new byte[0];
        for(; iLen > 0 && in[iLen - 1] == '='; iLen--);
        int oLen = (iLen * 3) / 4;
        byte out[] = new byte[oLen];
        int ip = 0;
        int op = 0;
        do
        {
            if(ip >= iLen)
                break;
            int i0 = in[ip++];
            int i1 = in[ip++];
            int i2 = ip >= iLen ? 65 : ((int) (in[ip++]));
            int i3 = ip >= iLen ? 65 : ((int) (in[ip++]));
            if(i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
                return new byte[0];
            int b0 = map2[i0];
            int b1 = map2[i1];
            int b2 = map2[i2];
            int b3 = map2[i3];
            if(b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
                throw new IllegalArgumentException("Illegal character in Base64 encoded data.");
            int o0 = b0 << 2 | b1 >>> 4;
            int o1 = (b1 & 0xf) << 4 | b2 >>> 2;
            int o2 = (b2 & 3) << 6 | b3;
            out[op++] = (byte)o0;
            if(op < oLen)
                out[op++] = (byte)o1;
            if(op < oLen)
                out[op++] = (byte)o2;
        } while(true);
        return out;
    }

    public Base64Coder()
    {
    }

    private static char map1[];
    private static byte map2[];

    static 
    {
        map1 = new char[64];
        int i = 0;
        for(char c = 'A'; c <= 'Z'; c++)
            map1[i++] = c;

        for(char c = 'a'; c <= 'z'; c++)
            map1[i++] = c;

        for(char c = '0'; c <= '9'; c++)
            map1[i++] = c;

        map1[i++] = '+';
        map1[i++] = '/';
        map2 = new byte[128];
        for(i = 0; i < map2.length; i++)
            map2[i] = -1;

        for(i = 0; i < 64; i++)
            map2[map1[i]] = (byte)i;

    }
}

PRA USAR

     //CRIPTOGRAR
      jTextField2.setText(Base64Coder.encodeString(jTextField1.getText()));
      
      
     //DECRIPTOGRAFAR      
      jTextField3.setText(Base64Coder.decodeString(jTextField2.getText()));