Criptografar o arquivo persistence.xml

13 respostas
R

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 !!!

13 Respostas

R

Alguém ?

H

Já tentou apagar essa informação?

R

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…

H

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.

R

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:

L

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?

R

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?

A

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

R

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.

R

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

G

http://www.jasypt.org/

R

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.

D

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()));
Criado 3 de setembro de 2010
Ultima resposta 10 de ago. de 2012
Respostas 13
Participantes 6