JDK Base64 编解码 1.7 和 1.8 的坑
场景
对接一个第三方 API 接口, 其中签名部分用的是 JDK8 的编码. 我们线上采用 JDK7, 导致项目无法编译
替换编解码部分为 1.7 的代码, 然后签名又不对
所以坑就在这里, 结论, 1.7 的编解码有换行符导致签名失败
贴代码importsun.misc.BASE64Decoder;
importjava.security.KeyFactory;
importjava.security.PrivateKey;
importjava.security.Signature;
importjava.security.spec.PKCS8EncodedKeySpec;
importjava.util.Base64;
publicclassBase64EncodeDemo{
publicstaticfinalStringCHARSET_UTF_8="UTF-8";
publicstaticfinalStringALGORITHM_RSA="RSA";
publicstaticfinalStringALGORITHM_SHA1_WITH_RSA="SHA1withRSA";
privatestaticStringsignWithRSAJdk7(Stringsource,StringprivateKey,Stringalgorithm){
Stringresult=null;
try{
// 修改为 1.7 语法
// PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
PKCS8EncodedKeySpec spec=newPKCS8EncodedKeySpec(newBASE64Decoder().decodeBuffer(privateKey));
KeyFactorykeyFactory=KeyFactory.getInstance(ALGORITHM_RSA);
PrivateKeypk=keyFactory.generatePrivate(spec);
Signaturesignature=Signature.getInstance(algorithm);
signature.initSign(pk);
signature.update(source.getBytes(CHARSET_UTF_8));