Java Web项目URL参数加密的终极解决方案
对于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`目录即可。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。