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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <hibernate-configuration> <session-factory> <property name="connection.provider_class"> org.jasypt.hibernate.connectionprovider.EncryptedPasswordDriverManagerConnectionProvider </property> <property name="connection.encryptor_registered_name"> configurationHibernateEncryptor </property> <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@192.168.1.1:1521:XE</property> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.username">srcweb</property> <property name="hibernate.connection.password">ENC(r4Tjm3PB0LndmGQ/RqRBRA==)</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> <!-- mappings --> </session-factory> </hibernate-configuration> |
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:
1 2 3 4 | <context-param> <param-name>br.com.caelum.vraptor.provider</param-name> <param-value>com.seu.namespace.provider.CustomProvider</param-value> </context-param> |
A classe CustomProvider ficou assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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