当前位置:编程学习 > JS >>

jsp url传参加密

一般我们在form提交时不要担心我们的参数会显示给用户看。
 
 
 
我们主要解决的是以get方式进行url参数传递的问题,如:
 
 
 
http://xxx.xxx.xxx.xxx/xxx/xxx.do?pId=101&imageName=processimage.jpg这样的url pId=101&imageName=processimage.jgp这样的参数如何进行加密。
 
 
 
我们采用:
 
 
 
java.net.URLEncoder.encode(Base64编码(加密字串), StringCode) 这样的方法来对url中的参数进行加密。
 
 
 
首先我们先说一下如何加密。
 
 
 
一、算法的选择:
 
 
 
对于像对url中的参数进行加密的过程,我不建议使用rsa或者是三重des这样的加密算法,主要原因在于性能和速度会受影响。
 
 
 
我建议大家使用对称加密如:DES或者是PBE算法。
 
 
 
我们在这边就使用PBEWithMD5AndDES来实现加密。
 
 
 
二、加密原理
 
 
 
对于一个纯文本,加密后它会变成一堆乱码,这堆乱码包括了许多非法字符,我们不希望把这些字符放入bean中,因此在加密完后,我们还要对加密结果进行base64编码。
 
 
 
PBE从字面上理解,它必须使用一个口令,我们不希望我们的加密过于复杂而影响页面跳转的速度,因此我们不采用口令+KEY的形式,我们这边的口令就是我们的KEY。
 
 
 
因此:
 
 
 
我们的整个加密过程实现如下:
 
 
 
输入口令(KEY)--> 加密文本 --> 以base64对加密后的结果进行编码-->以java.net.URLEncoder.encode编码成浏览器可以识别的形式-->传输给接受的action
 
 
 
而解密过程如下:
 
 
 
接受的action得到参数-->以base64对结果进行解码-->得到纯加密文本-->解密-->得到解密后的值
 
 
 
三、BASE64
 
这边对于BASE64的原理不多说了,只说实现,目前网上有很多实现方式,有自己写的,有用sun.misc.*的,我们在这个例子里将使用javax.mail.internet.MimeUtility自带的base64编码工具。
 
需要引入activation.jar和mail.jar两个包。 下面是具体的实现:
 
Java代码 
import javax.mail.internet.MimeUtility;  
public class Base64 {  
 public static byte[] encode(byte[] b) throws Exception {  
  ByteArrayOutputStream baos = null;  
  OutputStream b64os = null;  
  try {  
   baos = new ByteArrayOutputStream();  
   b64os = MimeUtility.encode(baos, "base64");  
   b64os.write(b);  
   b64os.close();  
   return baos.toByteArray();  
  } catch (Exception e) {  
   throw new Exception(e);  
  } finally {  
   try {  
    if (baos != null) {  
     baos.close();  
     baos = null;  
    }  
   } catch (Exception e) {  
   }  
   try {  
    if (b64os != null) {  
     b64os.close();  
     b64os = null;  
    }  
   } catch (Exception e) {  
   }  
  }  
 }  
 public static byte[] decode(byte[] b) throws Exception {  
  ByteArrayInputStream bais = null;  
  InputStream b64is = null;  
  try {  
   bais = new ByteArrayInputStream(b);  
   b64is = MimeUtility.decode(bais, "base64");  
   byte[] tmp = new byte[b.length];  
   int n = b64is.read(tmp);  
   byte[] res = new byte[n];  
   System.arraycopy(tmp, 0, res, 0, n);  
   return res;  
  } catch (Exception e) {  
   throw new Exception(e);  
  } finally {  
   try {  
    if (bais != null) {  
     bais.close();  
     bais = null;  
    }  
   } catch (Exception e) {  
   }  
   try {  
    if (b64is != null) {  
     b64is.close();  
     b64is = null;  
    }  
   } catch (Exception e) {  
   }  
  }  
 }  
}  
 
 
 
 
四、加密解密工具类的实现
 
 
 
有了BASE64的工具类,下面的工作将变得简单了,编写我们的加密解密工具类吧:
 
 
 
Java代码 
import java.io.DataOutputStream;  
import java.io.FileOutputStream;  
import java.security.*;  
import javax.crypto.*;  
import javax.crypto.spec.*;  
import java.util.*;  
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
public class SecurityHelper {  
 protected final static Log logger = LogFactory.getLog(SecurityHelper.class);  
 private final static int ITERATIONS = 20;  
 public static String encrypt(String key, String plainText) throws Exception {  
  String encryptTxt = "";  
  try {  
   byte[] salt = new byte[8];  
   MessageDigest md = MessageDigest.getInstance("MD5");  
   md.update(key.getBytes());  
   byte[] digest = md.digest();  
   for (int i = 0; i < 8; i++) {  
    salt[i] = digest[i];  
   }  
   PBEKeySpec pbeKeySpec = new PBEKeySpec(key.toCharArray());  
   SecretKeyFactory keyFactory = SecretKeyFactory  
     .getInstance("PBEWithMD5AndDES");  
   SecretKey skey = keyFactory.generateSecret(pbeKeySpec);  
   PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATIONS);  
   Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");  
   cipher.init(Cipher.ENCRYPT_MODE, skey, paramSpec);  
   byte[] cipherText = cipher.doFinal(plainText.getBytes());  
   String saltString = new String(Base64.
补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,