如何调试jasypt

时间:2016-05-09 17:26:50

标签: java spring hibernate encryption jasypt

我目前有三个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

1 个答案:

答案 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.StandardPBEStringEncryptororg.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig来声明算法以及包含解密密码(“password1”)的环境变量的名称。

这里详细描述了该方案: Encrypting Properties With Jasypt

Jasypt Documentation

一旦您认为所有这些都有效,您应该在日志中找到: 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重置为应该是什么并重新启动。解密应该再次起作用。