记一次 maven resource导致的问题
在最近一次对接中,由于对方采用了秘钥进行加解密,于是将公钥放在了项目中,但是在进行单元测试的时候一直提示
java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=111, too big.
而对应的代码调用其实也是很简单的,代码如下
public static void main(String[] args) throws Exception {
try{
String path = Test.class.getClassLoader().getResource("").toURI().toString();
path = path+"key/public.key";
URI uri = new URL(path).toURI();
byte[] publicKeyBytes = Files.readAllBytes(Paths.get(uri));
}catch (Exception e){
e.printStackTrace();
}
}
/**
*
* @param pinBytes
* @param publicKeyBytes
* @return
*/
private static String encryptPin(byte[] pinBytes, byte[] publicKeyBytes) {
try {
byte[] pinEnc = encryptByPublicKey(pinBytes, publicKeyBytes);
return java.util.Base64.getEncoder().encodeToString(pinEnc);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static byte[] encryptByPublicKey(byte[] data, byte[] key) {
try {
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}catch (Exception e){
e.printStackTrace();
return null;
}
}
经过查看日志是在
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
这一行报的错,刚开始时百思不得其解,觉得应该没啥问题,后面在自己将代码剥离,独立一个项目进行处理的时候发现是没有报错的。于是开始思考问题在哪里,最后锁定唯一不同的是项目里边的key文件是经过maven打包处理后的,于是对比了两个文件。一个是target目录下的文件,一个是源文件。惊奇的发现文件的大小已经不一致了
。问题找到了,由于public.key已经被修改了,于是就失效了。那么怎么解决呢!通过在pom.xml加入如下代码
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration><encoding>UTF-8</encoding>
<!-- Filter certificate files with suffix pkcs12, jks -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pkcs12</nonFilteredFileExtension>
<nonFilteredFileExtension>jks</nonFilteredFileExtension>
<nonFilteredFileExtension>key</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
总结
maven 在打包的时候,会对文件进行自动编码,默认采用utf-8编码,那么经过编码的文件可能已经改变了文件本身的内容,最终导致文件不可用,对于这样的文件,需要手动指定不进行处理转换