VRaptor e o Hibernate.cfg encriptado com jasypt

Essa semana eu tive que resolver esse problema. Estava eu fazendo um site em java usando o framework VRaptor (que é muito bom por sinal) e eu precisa encriptar a senha do arquivo Hibernate.cfg.xml – acho que isso devia ser o padrão, e por sinal não é. De qualquer forma, eu gastei um tempo quebrando a cabeça pra fazer isso.

A solução que eu encontrei foi usar o framework jasypt que precisa de algumas configurações mas funciona muito bem.

Depois de baixar o jasypt e adicionar a lib no classpath, o arquivo hibernate.cfg.xml deve ficar assim:


    
        
            org.jasypt.hibernate.connectionprovider.EncryptedPasswordDriverManagerConnectionProvider

        
        
            configurationHibernateEncryptor
        
        org.hibernate.dialect.OracleDialect
        jdbc:oracle:thin:@192.168.1.1:1521:XE
        oracle.jdbc.driver.OracleDriver
        srcweb
        ENC(r4Tjm3PB0LndmGQ/RqRBRA==)
        true
        update
        org.hibernate.cache.HashtableCacheProvider
        
    

Nessa configuração o hibernate é informado que deve usar DriverManager do Jasypt. Também informamos o hibernate qual é o objeto responsável pela encriptação/decriptação, no nosso caso o configurationHibernateEncryptor.

Veja que a senha está encriptada e usando uma função ENC, é assim que o jasypt sabe que a informação está encriptada.

Agora, precisamos dizer para o hibernate qual é esse objeto configurationHibernateEncryptor. A solução que eu encontrei foi registrar na inicialização da aplicação.

Primeiro é preciso criar um provider customizado para o VRaptor. No arquivo web.xml adicione:


    br.com.caelum.vraptor.provider
    com.seu.namespace.provider.CustomProvider

A classe CustomProvider ficou assim:

public class CustomProvider extends SpringProvider
{
    @Override
    protected void registerCustomComponents(ComponentRegistry registry) {
        registry.register(SessionCreator.class, SessionCreator.class);
        registry.register(SessionFactoryCreator.class, SessionFactoryCreator.class);
        registry.register(HibernateTransactionInterceptor.class,
            HibernateTransactionInterceptor.class);
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword("sua_senha");
        HibernatePBEEncryptorRegistry registryEncryptor = HibernatePBEEncryptorRegistry.getInstance();
        registryEncryptor.registerPBEStringEncryptor("configurationHibernateEncryptor",
            encryptor);
    }
}

Pronto, junto com o jasypt vem um arquivo encrypt.bat/encrypt.sh que você usa para gerar a senha encriptada da seguinte forma:

encrypt input=texto_para_encriptar password=sua_senha