参考:https://www.cnblogs.com/java-zhao/p/5083427.html
Base64加解密
待后续再补充。。。
在url中的应用
由于当前项目中有一个接口会返回本系统的一个链接给外围系统,这个链接里面包含一个敏感ID。要给此ID加密,被外围系统调用时再解密。
由于base64加密后的字符串会出‘+’,'=',‘\' 等字符,在URL中传输都会先经过 URLEncoder.encode(),接收方再URLDecoder.decode()。这样处理后字符串已经不是以前那个字符串了,经常提示解密失败。对于这种情况大概有两种方案:
1.在URLEncoder.encode()前先将此类字符替换成别的字符,URLDecoder.decode()前又换回去。
先看现像:
System.out.println("1\t"+InfoMapEncrypt.urlEncrypt("860005757"));
String str = URLDecoder.decode("1ckvqzaBboEWvRgb32bm4qK%2BbjbJ1eStLZrCUynFGc8%3D", "UTF-8");
System.out.println("2\t"+str);
System.out.println("3\t"+URLDecoder.decode(str, "UTF-8"));
System.out.println("4\t"+InfoMapEncrypt.urlDecrypt(str));
// 1 1ckvqzaBboEWvRgb32bm4qK%2BbjbJ1eStLZrCUynFGc8%3D
// 2 1ckvqzaBboEWvRgb32bm4qK+bjbJ1eStLZrCUynFGc8=
// 3 1ckvqzaBboEWvRgb32bm4qK bjbJ1eStLZrCUynFGc8=
// javax.crypto.BadPaddingException: Given final block not properly padded...
这个模拟的就是生产上的情况,应用服务器有时会自动转一次,这个很奇怪。如果代码里面再转一次就会出问题。为了避免这种情况可以用下面的方式补救。
// 加密
String plaintext = "1ckvqzaBboEWvRgb32bm4qK+bjbJ1eStLZrCUynFGc8=";
String ciphertext = InfoMapEncrypt.encrypt(plaintext);
String encoder = ciphertext.replace("+", "-").replace("\"", "_");
return URLEncoder.encode(encoder, "UTF-8");
// 解密
decode = URLDecoder.decode(ciphertext, "UTF-8");
String decoder = decode.replace("-", "+").replace("_", "\"");
return InfoMapEncrypt.decrypt(decoder);
2. 使用 URLBase64 方式
参考: https://www.cnblogs.com/java-zhao/p/5083427.html
相关异常处理
sun.misc.BASE64Encoder找不到的解决方法
sun.misc.BASE64Encoder/BASE64Decoder类不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用。但是在eclipse中直接使用却找不到该类。
** 完美解决