近期,项目中需要接新的数据源,涉及加签验签,加解密 问题一:项目中引入的1.59版本,但打印出来却是1.50版本
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.59</version>
</dependency>
static {
// 防止内存中出现多次BouncyCastleProvider的实例
if (null == Security.getProvider(BouncyCastleProvider.PROVIDER_NAME)) {
Security.addProvider(new BouncyCastleProvider());
System.out.println("nothaveBouncyCastleProvider实例版本:"+Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion());
}else{
//执行到此处并打印1.50版本
System.out.println("有BouncyCastleProvider的实例版本:"+Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion());
}
}
原因: java项目用的jboss服务器启动的,jboss安装目录modules下面有1.50的jar,项目启动过程中会先加载modules中的jar,因此每次打印的版本号都是1.50 解决办法:
static {
// 防止内存中出现多次BouncyCastleProvider的实例
if (null == Security.getProvider(BouncyCastleProvider.PROVIDER_NAME)) {
Security.addProvider(new BouncyCastleProvider());
System.out.println("nothaveBouncyCastleProvider实例版本:"+Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion());
}else{
System.out.println("有BouncyCastleProvider的实例版本:"+Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion());
//先删除再重新加入即可!!!!!!!!!
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
BouncyCastleProvider bcp = new BouncyCastleProvider();
System.out.println("新增BC,版本为:"+bcp.getVersion());
Security.addProvider(bcp);
}
}
问题二:java.lang.SecurityException: JCE cannot authenticate the provider BC 因为本地采用jboss+jdk启动,百度说是jdk有安全验证,jdk换成openJdk即可;测试环境采用的jboss+openJdk,部署运行通过
问题三:第三方提供jar包,调用他们的jar包接入新的数据源接口,但本项目之前已经接入些接口,涉及加解密的bcprov-jdk15on.jar不兼容本次新接入接口,升级到高版本,之前老的接口又加解密失败。总结:尽量让第三方提供工具类,遇到问题时方便处理