最近维护的项目中3Des加密突然报空指针,记录下修复此次问题历程。
先看报错
跟进代码,如下:
static {
try {
key_ = new SecretKeySpec(keys, "TripleDES");
ciperEnc = Cipher.getInstance("TRIPLEDES/ecb/NoPadding");
ciperEnc.init(Cipher.ENCRYPT_MODE, key_);
ciperDec = Cipher.getInstance("TRIPLEDES/ecb/NoPadding");
ciperDec.init(Cipher.DECRYPT_MODE, key_);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
//e.printStackTrace();
}
}
发现是Cipher在获取3DES实例时失败,为null,百思不得其解,原本正常的代码突然报错了,百度一会后没找到答案,回归问题本身,翻阅下java文档(Java Platform SE 8),在里面找到答案。
1.选择所在的javax.crypto
2.查看Cipher,发现代码里的transformation不在标准transformation中,查看Cipher section
3. 发现java的3DES是使用 DESede
4.修改代码
static {
try {
key_ = new SecretKeySpec(keys, "DESede");
ciperEnc = Cipher.getInstance("DESede/ecb/NoPadding");
ciperEnc.init(Cipher.ENCRYPT_MODE, key_);
ciperDec = Cipher.getInstance("DESede/ecb/NoPadding");
ciperDec.init(Cipher.DECRYPT_MODE, key_);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
//e.printStackTrace();
}
}
5.重新编译启动,问题解决。