用Base64编码的加密字符串在经过URL后不保留



将"data"String编码为Base64 (URL安全版本),然后加密为byte array。此byte array被转换为String并发送到REST web服务。当它到达web服务端时,String的长度已经改变。我不是专家,我哪里做错了?

代码:

//CLIENT SIDE
import org.apache.commons.codec.binary.Base64;    
String data = "My message to be encrypted";        
PublicKey pubKey = readPublicKeyFromFile();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] encryptedData = cipher.doFinal(Base64.encodeBase64URLSafe(data.getBytes()));
System.out.println("length of original data string: " + data.length());
System.out.println("length of original data string turned into byte array: " + data.getBytes().length);
System.out.println("length of data string encrypted into byte array: " + encryptedData.length);
String encryptedDataToString = new String(encrypedData,"UTF-8");
System.out.println("length encrypted String into byte array, converted back to String for url: " + encryptedDataToString.length);
httpclient = new DefaultHttpClient();
builder = new URIBuilder();
builder.setScheme("http").setHost(xxx + "webresources/GetData/" + path)
                    .setParameter("data", encryptedDataToString);
            uri = builder.build();

//SERVER SIDE
import org.apache.commons.codec.binary.Base64;
@GET
@Path("path")
@Produces("text/plain")
public String getToken(@QueryParam("data") String data) {
System.out.println("length of data: " + data.length());
System.out.println("length of data to byte array wthout decoding: " + data.getBytes().length);
System.out.println("length of data to byte decoded: " + Base64.decodeBase64(data).length);

//CONSOLE
//CLIENT SIDE
length of original data string: 37
length of original data string turned into byte array: 37
length of data string encrypted into byte array: 256
length encrypted String into byte array, converted back to String for url: 256
//SERVER SIDE
INFO: length of data: 237
INFO: length of data to byte wthout decoding: 444
INFO: length of data to byte decoded: 4

数据String,因为它出现在URL, 客户端:T % 23% EF % BF % BD % 0 c % EF % BF % BD % EF % BF % BD7%EF % BF % BD % EF % BF % BDk % BDA EF % BF % % EF % BF % BD % 10 l % EF % BF % BD % EF % BF % BD % EF % BF % BD % 14% EF % BF % BD % EF % BF % BD % 5 e % 15 b % 1 ae % 01% 22% EF % BF % BDgmE % 0 c % EF % BF % BD % EF % BF % BDn % EF % BF % BD % 3 d % EF % BF % BD % EF % BF % BD EF % BF % %直流% 80% BD % EF % BF % BDIM % EF % BF % BD % EF % BF % BD % EF % BF % BD % EF % BF % BDeM % EF % BF % BD5%EF % BF % BD % EF % BF % BD % 26% EF % BF % BD % 1 e % 7 d % EF % BF % BDNAQ % EF % BF % BDlT % EF % BF % BD % EF % BF % BDVXR % EF % BF % BDi % 0 e % EF % BF % BD % EF % BF % BD % EF % BF % BD3U % 0 c % EF % BF % BD % EF % BF % BD % 1 e % EF % BF % BD % EF % BF % BD % 0聚全氟乙丙烯% EF % BF % BD % C3%A1b6%EF % BF % BD % CE % B5y9x % EF % BF % BD % EF % BF %BD % 0 d % EF % BF % BD % EF % BF % BD % EF % BF % BD % EF % BF % BD % 18% 7 c % 06% 21% EF % BF % BD0%EF % BF % BD % EF % BF % BD % EF % BF % BD % 03% EF % BF % BD cb % % 17% 8 f % 7 d % EF % BF % BD % 26 EF % EF % BF % BD % 12% % BF % BD % EF % BF % BD % EF % BF % BD - DE % 8 d % % EF % BF % BD % EF % BF % BD % EF % BF % BDt % EF % BF % BD % EF % BF % BD % EF % BF % BDTezs % EF % BF % BD % 0 c % EF % BF % BD % 2 c % EF % BF % BD % EF % BF % BD % EF % BF % BD EF % BF % % DD % 94% BD % EF % BF % BD % EF % BF % BD % EF % BF % BD % EF % BF % BD % EF % BF % BD % 19% EF % BF % BD % 25% EF % BF % BDt % EF % BF % BDQ % EF % BF % BD % 7 d % EF % BF %快速公车提供% EF % BF % BD % EF % BF % BD % EF % BF % BD % 1一个% EF % BF % BD + % EF % BF % BD % CF % 86 r % EF % BF % BDW % EF % BF % BDU % EF % BF % BDxo % BDd EF % BF % % EF % BF % BD % 08 - % 3 F % EF % BF % BD % 2 F % EF % BF % BD % 5 bg % EF % BF % BD2%EF % BF % BD % EF % BF % BDk % 5年来e % EF % BF % % EF % BF % BD % EF % BF % BD % 25% EF % BF % BD % EF % BF % BD * % 07% 5 e % EF % BF % BD % EF % BF % BD % EF % BF % BD % EF % BF % BDU % EF % BF % BD % 7 F % EF % BF % BDP % EF % BF % BD % EF % BF % BD % EF % BF % BD EF % BF % % 7 b % 07% BDO % EF % BF % BD % EF % BF % BD cb % 9 c % % 11% EF % BF % BD % 1 dk % EF % BF % BDkL8%EF % BF % BD * % EF % BF % BD % 1 d % EF % BF % BDl % EF % BF % BD % EF % BF % BD % EF % BF % BD % 02% EF % BF % BD

接收到的String数据,服务器端:
k T #���7����L�����^"是沃豪分公司�加工工厂���n =��܀��我����eM�5��,�}�NAQ�lT��VXR�我���3 U����ep�ab6�εy9x������| !�0����ˏ}�,一����-ލ���T���特斯��,���ݔ�������% Q�T��}�F���n��φxo U R W����d - ?�/�[g�2��k ^�m��%�� ^����你��P���{�O��˜k��kL8���l���

(不确定这些字符是实际收到的,还是只是错误地打印在控制台上?)

你必须先加密,然后用base64编码,通过网络发送。否则,加密会创建(伪)随机数据,其中一些部分可能无法正确编码以通过网络传输,并且不可避免地会损坏。

如果想压缩数据,同样适用。在加密之前进行压缩,因为在加密之后,算法将很难压缩看似随机的数据。
一般来说,你发送给web服务的东西应该是base64编码的,作为最后一步/修改。

最新更新