我已经编写了一个rest服务来加密和解密URL。
加密代码:@GET
@Produces("application/json")
@Path("/encrypt/")
public Response encryptWithQuery(@QueryParam("plainString") String plainString)
throws JSONException {
Response response = new Response();
AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
response = util.encrypt(SALT, IV, PASSPHRASE, plainString);
return response;
}
解密代码:
@GET
@Produces("application/json")
@Path("/decryptWP/")
public Response decryptWithQuery(@QueryParam("encryptString") String encryptString)
throws JSONException {
Response response = new Response();
AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
response = util.decrypt(SALT, IV, PASSPHRASE, encryptString);
return response;
}
当我调用我的加密rest服务时,我得到加密字符串
url用于加密
http://localhost:9080/kttafm/keybank/encrypt?plainString=http://localhost:9080/kttafm/master.jsp?abc=zyx
但是当我调用解密rest服务时,我得到下面的异常
javax.crypto.BadPaddingException: Given final block not properly padded
但是如果我从@Queryparam移动到@path param,解密工作正常,
可以正常工作并解密加密字符串的方法是
@GET
@Produces("application/json")
@Path("/decrypt/{encryptString}")
public Response decrypt(@PathParam("encryptString") String encryptString)
throws JSONException {
Response response = new Response();
AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
response = util.decrypt(SALT, IV, PASSPHRASE, encryptString);
return response;
}
我错过了什么?
请确保始终在客户端对参数进行编码,例如使用URLEncoder。
例如,您的加密URL必须是
http://localhost:9080/kttafm/keybank/encrypt?plainString=http%3A%2F%2Flocalhost%3A9080%2Fkttafm%2Fmaster.jsp%3Fabc%3Dzyx
给定加密字符串示例:"fbSjGsyDYfmJM4rAURhgdpX+XKQr8WTfiZC7PaBqK7KzfUEYau1cpXnhECqRT47n",我可以看到有一个"+"字符是URL解码的候选字符。您可以使用这个URL解码网站http://meyerweb.com/eric/tools/dencoder/来查看当您解码字符串时+号被转换。
这将导致解密错误,因为您的算法将不完全符合预期。
您可以通过在您的解密方法中添加一些调试消息来确保这一点,如下例所示:
@GET
@Produces("application/json")
@Path("/decrypt/{encryptString}")
public Response decrypt(@PathParam("encryptString") String encryptString)
throws JSONException {
System.out.println(encryptString);
Response response = new Response();
...
}
一个解决方案是在调用服务之前在客户端执行URL编码。在这种情况下,您的示例看起来像:"fbSjGsyDYfmJM4rAURhgdpX%2BXKQr8WTfiZC7PaBqK7KzfUEYau1cpXnhECqRT47n"
注意加号的转换