Base64加解密及在URL中的应用

本文介绍了一种在URL中对敏感ID进行Base64加密和解密的方案,以防止因特殊字符导致的解密失败问题。通过替换加密字符串中的特殊字符并在解密前还原这些字符,确保了数据的正确传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考: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中直接使用却找不到该类。


** 完美解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值