我目前有三个java应用程序要加密数据库密码。对于我的第一个应用程序,jasypt的以下语法有效。我有一个加密的密码,它可以登录到数据库,没有任何问题。但是,我的其他两个应用程序失败,出现无效/用户名密码错误。 我的主要问题:有没有办法调试jasypt所以我可以看看它是否试图解密下面指定的密码?我猜测解密失败,它正在尝试使用加密密码登录。如果我将persistence.xml更改回未加密的密码,它可以正常工作。 感谢任何人的想法!
以下是我的文件:
jasypt密码gen:
c:\jasypt-1.9.2\bin\encrypt input=mydbpassword password=password algorithm=PBEWithMD5AndTripleDES
----ENVIRONMENT----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 24.45-b08
-----ARGUMENTS-----------------
input: mydbpassword
password: password
algorithm: PBEWithMD5AndTripleDES
------OUTPUT-------------------
h+RqHWpovo5q390ID9+dTTs/9k0bmwlI
的persistence.xml
<persistence-unit name="localDB" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="connection.provider_class" value="org.jasypt.hibernate.connectionprovider.EncryptedPasswordDriverManagerConnectionProvider" />
<property name="connection.encryptor_registered_name" value="strongHibernateStringEncryptor" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" />
<!-- DEV -->
<property name="hibernate.connection.url" value="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=foo.com)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=db2)))" />
<property name="hibernate.connection.username" value="db2" />
<property name="hibernate.connection.password" value="ENC(h+RqHWpovo5q390ID9+dTTs/9k0bmwlI)" />
spring bean:
<bean id="hibernateStringEncryptor" class="org.jasypt.hibernate3.encryptor.HibernatePBEStringEncryptor">
<property name="registeredName">
<value>strongHibernateStringEncryptor</value>
</property>
<property name="algorithm">
<value>PBEWithMD5AndTripleDES</value>
</property>
<property name="password>
<value>password</value>
</property>
</bean>
部署应用时收到的错误:
2016-05-09 16:37:29,149 INFO [STDOUT] INFO [DriverManagerConnectionProvider] using driver: oracle.jdbc.driver.OracleDriver at URL: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=foo.com)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=db2)))
2016-05-09 16:37:29,149 INFO [STDOUT] INFO [DriverManagerConnectionProvider] connection properties: {user=db2, password=****,autocommit=true,release_mode=auto}
2016-05-09 16:37:29,149 INFO [STDOUT] WARN [SettingsFactory] Could not obtain conection metadata java.sql.SQLException: ORA-01017: Invalid username/password; logon denied
答案 0 :(得分:0)
我想你现在已经解决了。但是你要求“......任何人都可能有任何想法!”如果其他人有同样的问题,这里有一些提示。
附加jasypt源代码并在引发与身份验证失败相关的异常时对其进行跟踪。查找解密密码的部分 如果缓冲区为空,您将知道它找不到密码。
而不是在persistence.xml中将加密的Oracle密码显示为明文,您可以将解密密码(“password1”)注入运行时环境,jasypt将用于解密加密的Oracle密码(“password2”)存储在类路径上安装的属性文件中:
password2=ENC(h+RqHWpovo5q390ID9+dTTs/9k0bmwlI)
请注意,jasypt可以在解密后从内存中清除解密的密码。
请参阅:
org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer
...从属性文件中读取加密的Oracle密码2,将其传递给jasypt decryptor bean,该bean使用env var $ {password1}解码password2,将解密后的结果放入env var $ {password2},这可以然后在persistence.xml中引用:
<property name="hibernate.connection.password" value="${password2}" />
因此,password2在属性文件中开始加密,并以env var $ {password2}解密。
您还需要org.jasypt.encryption.pbe.StandardPBEStringEncryptor
和org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig
来声明算法以及包含解密密码(“password1”)的环境变量的名称。
这里详细描述了该方案: Encrypting Properties With Jasypt
一旦您认为所有这些都有效,您应该在日志中找到:
EncryptablePropertyPlaceholderConfigurer -Loading properties file from class path resource [your.file.properties]
您可以通过向password1添加单个字符来破解它以证明该概念。重新启动应用程序,您应该在日志中找到:
EncryptablePropertyPlaceholderConfigurer -Loading properties file from class path resource [your.file.properties]
然后EncryptionOperationNotPossibleException
。
将password1重置为应该是什么并重新启动。解密应该再次起作用。