2016 - 2024

感恩一路有你

Java Web项目URL参数加密的终极解决方案

浏览量:1598 时间:2024-07-17 11:58:56 作者:采采

对于Java Web项目中传递的URL参数,通常需要进行加密以保护数据安全。本文将介绍一种终极解决方案来实现URL参数的加密。

一、算法的选择

在对URL参数进行加密时,不建议使用RSA或者三重DES等复杂的加密算法,因为这会影响性能和速度。建议使用对称加密算法,如DES或PBE(Password Based Encryption)算法。本文将使用PBEWithMD5AndDES算法来实现加密。

二、加密原理

对于纯文本,加密后会生成一串乱码。为了避免乱码中包含非法字符,我们需要对加密结果进行Base64编码。PBE算法需要一个口令(KEY),为了简化加密过程并提高页面跳转速度,我们将直接使用KEY作为口令。具体加密过程如下:

输入口令(KEY) -> 加密文本 -> 使用Base64编码加密结果 -> 使用方法编码为浏览器可识别的形式 -> 传输给接收的Action。

解密过程如下:

接收的Action获取参数 -> 使用Base64解码结果 -> 获取纯加密文本 -> 解密 -> 获取解密后的值。

三、Base64实现

Base64编码有很多实现方式,可以自己编写,也可以使用内置的base64编码工具。需要引入activation.jar和mail.jar两个包。具体实现如下:

```java

import ;

public class Base64Util {

public static String encode(String text) throws Exception {

return MimeUtility.encodeText(text, "utf-8", "B");

}

public static String decode(String text) throws Exception {

return (text);

}

}

```

四、加密解密工具类的实现

有了Base64工具类之后,实现加密解密工具类就变得简单了。下面是一个示例代码:

```java

import ;

import ;

import ;

import ;

import ;

import ;

public class EncryptionUtils {

private final static int ITERATIONS 20;

private final static int SALT_LENGTH 12;

private final static String ALGORITHM "PBEWithMD5AndDES";

private final static String KEY "your_key";

public static String encrypt(String input) throws Exception {

byte[] salt new byte[SALT_LENGTH];

PBEParameterSpec parameterSpec new PBEParameterSpec(salt, ITERATIONS);

PBEKeySpec keySpec new PBEKeySpec(());

SecretKeyFactory keyFactory (ALGORITHM);

Cipher cipher (ALGORITHM);

(Cipher.ENCRYPT_MODE, (keySpec), parameterSpec);

byte[] encryptedData (());

return Base64Util.encode(new String(encryptedData));

}

public static String decrypt(String input) throws Exception {

byte[] salt new byte[SALT_LENGTH];

PBEParameterSpec parameterSpec new PBEParameterSpec(salt, ITERATIONS);

PBEKeySpec keySpec new PBEKeySpec(());

SecretKeyFactory keyFactory (ALGORITHM);

Cipher cipher (ALGORITHM);

(_MODE, (keySpec), parameterSpec);

byte[] decryptedData ((input).getBytes());

return new String(decryptedData);

}

}

```

五、在Struts Action中的使用

可以在Struts Action中直接调用加密解密工具类来处理加密和解密操作。例如:

```java

public class MyAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

String encryptedValue EncryptionUtils.encrypt("123456");

("encryptedValue", encryptedValue);

return ("success");

}

}

```

六、在JSP页面中的处理

在JSP页面中,可以通过EL表达式获取到加密后的参数,并使用``方法进行解码。例如:

```jsp

<%

String encryptedValue (String) ("encryptedValue");

String decryptedValue (encryptedValue);

%>

Decrypted Value: <% decryptedValue %>

```

七、接收加密参数的Action中的解密

假设接收加密参数的Action为`QueryAction`,其中的`processDefId`和`processImgPath`是加密的参数。可以在该Action中直接调用解密方法进行解密操作。例如:

```java

public class QueryAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

String encryptedProcessDefId ("processDefId");

String encryptedProcessImgPath ("processImgPath");

String processDefId (encryptedProcessDefId);

String processImgPath (encryptedProcessImgPath);

// 其他业务逻辑处理

...

return ("success");

}

}

```

八、KEY(口令)的存放

将KEY存放在服务器端的properties文件中,可以使用Spring Jasypt来实现加密存储。首先需要使用jasypt的encrypt工具对KEY进行加密,并将加密后的值存放在properties文件中。例如:

```bash

encrypt inputmykey passwordsecret algorithmPBEWithMD5AndDES

```

然后将生成的乱码复制到properties文件中,并在外层加上`ENC()`,如:

```

(OlO0LqELUuLOVreCtDngHaNgMcZWUyUg)

```

在工程部署的机器上设置一个环境变量,如:

```bash

set APP_ENCRYPTION_PASSWORDsecret

```

然后配置Spring,使其在加载工程时自动解密。以下是详细的配置内容:

```xml

```

九、注意事项

如果使用MyEclipse进行开发,在运行时可能会出现`NoClassDefFoundError`错误。这是因为jar包版本不统一导致的。解决方法是删除`Java EE 5 Libraries/javaee.jar/mail`目录中的包。具体步骤如下:用rar打开`D:MyEclipse8.6GenuitecCommonplugins_datalibrarysetEE_5javaee.jar`,然后删除`mail`目录即可。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。