java对jdbc.properties文件的数据库账号密码进行加密,查询时不能正常查询,不能解密

hepta- 2019-01-18 04:06:25
问题:
java 的ssm对jdbc.properties文件的数据库账号密码进行加密,现在问题是没有进行加密时,可以正常的连接查询;加密后可以正常的启动连接,但是一查询就不能查询,加密的账号密码没有进行解密,
报错信息:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '3wir5v+MgYH2IqEC1j4hDUggrXgXVC2r/Ah4Tm5aqZQ=.encryption'
### The error may exist in file [D:\Java\apache-tomcat-7.0.90\webapps\DataLink\WEB-INF\classes\com\aa\api2\mapper\CustomerMapper_yh.xml]
### The error may involve com.aa.api2.dao.ICustomerDao2.getAllCustomer
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '3wir5v+MgYH2IqEC1j4hDUggrXgXVC2r/Ah4Tm5aqZQ=.encryption'



下面是项目的相关信息:
1、jdbc.properties文件
#数据源2
jdbc.driver2=3wir5v+MgYH2IqEC1j4hDUggrXgXVC2r/Ah4Tm5aqZQ=.encryption
jdbc.url2=JJjXfBGoZqt26mFQLlvLGROAOFUUkeoNTZmekjWDYbtXSDJxdBVSnvOJ0wPaX/DK.encryption
jdbc.username2=dGN8ovU9LpfA0omlTZ1img==.encryption
jdbc.password2=/5kb+M7G3ivarVFSVn6SYg==.encryption

2、applicationContext.xml的配置信息:

<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
<property name="fileEncoding" value="utf-8"/>
</bean>

<bean class="com.aa.common.DBUtil.EncrypPropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="ignoreResourceNotFound" value="true"/>
<!-- <property name="locations" value="classpath:jdbc.properties"/> -->
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>

<!-- 数据源2 开始 -->
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver2}" />
<property name="url" value="${jdbc.url2}" />
<property name="username" value="${jdbc.username2}" />
<property name="password" value="${jdbc.password2}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${jdbc.initialSize}"/>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${jdbc.maxActive}"/>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${jdbc.maxIdle}"/>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${jdbc.minIdle}"/>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${jdbc.maxWait}"/>
</bean>

<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource2"
p:mapperLocations="classpath:com/aa/api2/mapper/*.xml" />

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="cn.aa.api.mapper" p:sqlSessionFactoryBeanName="sqlSessionFactory2" />

<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager2"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource2" />
<!-- 数据源2 结束 -->
<!-- 数据源2 -->
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--basePackage指定要扫描的包,在此包之下的映射器都会被搜索到。
可指定多个包,包与包之间用逗号或分号分隔-->
<property name="basePackage" value="com.aa.api2.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"></property>
</bean>
3、EncrypPropertyPlaceholderConfigurer.java文件:
public class EncrypPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {

@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
Properties props) throws BeansException {
/**数据源2 开始 */
String driver2 = props.getProperty("jdbc.driver2");
driver2 = driver2.substring(0, driver2.length() - 11);
if (driver2 != null) {// 将加密的driver2解密后塞到props
props.setProperty("jdbc.driver2",AESCoderUtils.AESDncode(driver2));
}
String url2 = props.getProperty("jdbc.url2");
url2 = url2.substring(0, url2.length() - 11);
if (url2 != null) {// 将加密的url2解密后塞到props
props.setProperty("jdbc.url2",AESCoderUtils.AESDncode(url2));
}
String username2 = props.getProperty("jdbc.username2");
username2 = username2.substring(0, username2.length() - 11);
if (username2 != null) {// 将加密的username解密后塞到props
props.setProperty("jdbc.username2",AESCoderUtils.AESDncode(username2));
}
String password2 = props.getProperty("jdbc.password2");
password2 = password2.substring(0, password2.length() - 11);
if (password2 != null) {
props.setProperty("jdbc.password2",AESCoderUtils.AESDncode(password2));
}
/**数据源2 结束*/

super.processProperties(beanFactoryToProcess, props);
}

}
4、AESCoderUtils.java文件:
public class AESCoderUtils {

/*
* 加密
*/
public static String AESEncode(String content) {
try {
// 1.构造密钥生成器,指定为AES算法,不区分大小写
KeyGenerator keygen = KeyGenerator.getInstance("AES");
// xxx 为密钥
keygen.init(128, new SecureRandom("xxx".getBytes()));

SecretKey original_key = keygen.generateKey();

byte[] raw = original_key.getEncoded();

SecretKey key = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] byte_encode = content.getBytes("utf-8");

byte[] byte_AES = cipher.doFinal(byte_encode);

String AES_encode = new String(Base64.encodeBase64(byte_AES));

return AES_encode+".encryption";
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

return null;
}

/*
* 解密 
*/
public static String AESDncode(String content) {
try {

KeyGenerator keygen = KeyGenerator.getInstance("AES");

keygen.init(128, new SecureRandom("xxx".getBytes()));

SecretKey original_key = keygen.generateKey();

byte[] raw = original_key.getEncoded();

SecretKey key = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, key);

byte[] byte_content = Base64.decodeBase64(content);

byte[] byte_decode = cipher.doFinal(byte_content);
String AES_decode = new String(byte_decode, "utf-8");
return AES_decode;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
System.out.println("加密后:"+AESEncode("TIGER"));

System.out.println("解密后:"+AESDncode("3wir5v+MgYH2IqEC1j4hDUggrXgXVC2r/Ah4Tm5aqZQ=.encryption"));
}

}





...全文
2384 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
JAVA拾贝 2020-08-21
  • 打赏
  • 举报
回复
jasypt了解一下
家有皮总 2020-08-19
  • 打赏
  • 举报
回复 1
楼主解决了,我已经解决了,楼主配置错了, 1.id=propertyConfigurer的bean的class换成自定义的类, 2.下面那个<bean class="com.aa.common.DBUtil.EncrypPropertyPlaceholderConfigurer">的bean删除
tianfang 2019-06-04
  • 打赏
  • 举报
回复
把密码打印出来看看 看看解密正确了没有
isIndex 2019-06-04
  • 打赏
  • 举报
回复
解决了吗?记得分享,谢谢!

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧