在rest webservice中将url作为查询参数发送

时间:2015-10-15 05:54:55

标签: java rest encryption javax.crypto

我已经编写了一个用于加密和解密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;
}

当我拨打加密休息服务时,我会收到加密字符串

加密网址

http://localhost:9080/kttafm/keybank/encrypt?plainString=http://localhost:9080/kttafm/master.jsp?abc=zyx

但是当我打电话给解密休息服务时,我得到了以下异常

javax.crypto.BadPaddingException: Given final block not properly padded

但如果我从@Queryparam tp @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;
} 

我缺少什么?

2 个答案:

答案 0 :(得分:0)

请确保您始终encode客户端参数,例如使用URLEncoder.

例如,您的加密网址必须为

http://localhost:9080/kttafm/keybank/encrypt?plainString=http%3A%2F%2Flocalhost%3A9080%2Fkttafm%2Fmaster.jsp%3Fabc%3Dzyx

答案 1 :(得分:0)

鉴于加密的字符串示例:“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”

请注意+号的转换。