有时在应用中需要将java对象序列化存储起来,有的需要压缩,有的需要加密
EncryptUtil.java
- packageorg.test.demo;
- importjava.io.UnsupportedEncodingException;
- importjava.security.InvalidKeyException;
- importjava.security.NoSuchAlgorithmException;
- importjava.security.SecureRandom;
- importjavax.crypto.BadPaddingException;
- importjavax.crypto.Cipher;
- importjavax.crypto.IllegalBlockSizeException;
- importjavax.crypto.KeyGenerator;
- importjavax.crypto.NoSuchPaddingException;
- importjavax.crypto.SecretKey;
- importjavax.crypto.spec.SecretKeySpec;
- publicclassEncryptUtil{
- privatefinalstaticStringENCRYPTKEY="0123456789";
- /**
- *
- *@Title:getEncryptKey
- *@Description:检验加密key
- *@paramencryptKey
- *@return
- *String
- *
- */
- privatestaticStringgetEncryptKey(StringencryptKey){
- if(null==encryptKey||"".equals(encryptKey))returnENCRYPTKEY;
- returnencryptKey;
- }
- /**
- *
- *@Title:encrypt
- *@Description:加密:普通java字串加密成16进制字串(String->Byte->HexStr)
- *@paramcontent要加密处理的字串
- *@paramencryptKey加密密钥
- *@return
- *String
- *
- */
- publicstaticStringencrypt(Stringcontent,StringencryptKey){
- byte[]encryptResult=encryptStrToByte(content,getEncryptKey(encryptKey));
- returnparseByte2HexStr(encryptResult);
- }
- /**
- *
- *@Title:decrypt
- *@Description:加密:16进制字串解密成普通java字串(HexStr->Byte->String)
- *@paramcontent要解密处理的16进制字串
- *@paramencryptKey解密密钥
- *@return
- *String
- *
- */
- publicstaticStringdecrypt(Stringcontent,StringencryptKey){
- byte[]decryptFrom=parseHexStr2Byte(content);
- byte[]decryptResult=decrypt(decryptFrom,getEncryptKey(encryptKey));
- returnnewString(decryptResult);
- }
- /**
- *加密:字串-->二进制
- *@paramcontent需要加密的内容
- *@parampassword加密密码
- *@return
- */
- privatestaticbyte[]encryptStrToByte(Stringcontent,Stringpassword){
- try{
- KeyGeneratorkgen=KeyGenerator.getInstance("AES");
- kgen.init(128,newSecureRandom(password.getBytes()));
- SecretKeysecretKey=kgen.generateKey();
- byte[]enCodeFormat=secretKey.getEncoded();
- SecretKeySpeckey=newSecretKeySpec(enCodeFormat,"AES");
- Ciphercipher=Cipher.getInstance("AES");//创建密码器
- byte[]byteContent=content.getBytes("utf-8");
- cipher.init(Cipher.ENCRYPT_MODE,key);//初始化
- byte[]result=cipher.doFinal(byteContent);
- returnresult;//加密
- }catch(NoSuchAlgorithmExceptione){
- e.printStackTrace();
- }catch(NoSuchPaddingExceptione){
- e.printStackTrace();
- }catch(InvalidKeyExceptione){
- e.printStackTrace();
- }catch(UnsupportedEncodingExceptione){
- e.printStackTrace();
- }catch(IllegalBlockSizeExceptione){
- e.printStackTrace();
- }catch(BadPaddingExceptione){
- e.printStackTrace();
- }
- returnnull;
- }
- /**解密
- *@paramcontent待解密内容
- *@parampassword解密密钥
- *@return
- */
- privatestaticbyte[]decrypt(byte[]content,Stringpassword){
- try{
- KeyGeneratorkgen=KeyGenerator.getInstance("AES");
- kgen.init(128,newSecureRandom(password.getBytes()));
- SecretKeysecretKey=kgen.generateKey();
- byte[]enCodeFormat=secretKey.getEncoded();
- SecretKeySpeckey=newSecretKeySpec(enCodeFormat,"AES");
- Ciphercipher=Cipher.getInstance("AES");//创建密码器
- cipher.init(Cipher.DECRYPT_MODE,key);//初始化
- byte[]result=cipher.doFinal(content);
- returnresult;//加密
- }catch(NoSuchAlgorithmExceptione){
- e.printStackTrace();
- }catch(NoSuchPaddingExceptione){
- e.printStackTrace();
- }catch(InvalidKeyExceptione){
- e.printStackTrace();
- }catch(IllegalBlockSizeExceptione){
- e.printStackTrace();
- }catch(BadPaddingExceptione){
- e.printStackTrace();
- }
- returnnull;
- }
- /**将二进制转换成16进制
- *@parambuf
- *@return
- */
- privatestaticStringparseByte2HexStr(bytebuf[]){
- StringBuffersb=newStringBuffer();
- for(inti=0;i<buf.length;i++){
- Stringhex=Integer.toHexString(buf[i]&0xFF);
- if(hex.length()==1){
- hex='0'+hex;
- }
- sb.append(hex.toUpperCase());
- }
- returnsb.toString();
- }
- /**
- *将16进制转换为二进制
- *
- *@paramhexStr
- *@return
- */
- privatestaticbyte[]parseHexStr2Byte(StringhexStr){
- if(hexStr.length()<1)
- returnnull;
- byte[]result=newbyte[hexStr.length()/2];
- for(inti=0;i<hexStr.length()/2;i++){
- inthigh=Integer.parseInt(hexStr.substring(i*2,i*2+1),16);
- intlow=Integer.parseInt(hexStr.substring(i*2+1,i*2+2),
- 16);
- result[i]=(byte)(high*16+low);
- }
- returnresult;
- }
- }
GZipUtils.java
- packageorg.test.demo;
- importjava.io.ByteArrayInputStream;
- importjava.io.ByteArrayOutputStream;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importjava.util.zip.GZIPInputStream;
- importjava.util.zip.GZIPOutputStream;
- /**
- *GZIP工具
- *
- */
- publicabstractclassGZipUtils{
- publicstaticfinalintBUFFER=1024;
- publicstaticfinalStringEXT=".gz";
- /**
- *数据压缩
- *
- *@paramdata
- *@return
- *@throwsIOException
- *@throwsException
- */
- publicstaticbyte[]compress(byte[]data)throwsIOException{
- ByteArrayInputStreambais=newByteArrayInputStream(data);
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- //压缩
- compress(bais,baos);
- byte[]output=baos.toByteArray();
- baos.flush();
- baos.close();
- bais.close();
- returnoutput;
- }
- /**
- *文件压缩
- *
- *@paramfile
- *@throwsException
- */
- publicstaticvoidcompress(Filefile)throwsException{
- compress(file,true);
- }
- /**
- *文件压缩
- *
- *@paramfile
- *@paramdelete
- *是否删除原始文件
- *@throwsException
- */
- publicstaticvoidcompress(Filefile,booleandelete)throwsException{
- FileInputStreamfis=newFileInputStream(file);
- FileOutputStreamfos=newFileOutputStream(file.getPath()+EXT);
- compress(fis,fos);
- fis.close();
- fos.flush();
- fos.close();
- if(delete){
- file.delete();
- }
- }
- /**
- *数据压缩
- *
- *@paramis
- *@paramos
- *@throwsIOException
- *@throwsException
- */
- publicstaticvoidcompress(InputStreamis,OutputStreamos)throwsIOException
- {
- GZIPOutputStreamgos=newGZIPOutputStream(os);
- intcount;
- bytedata[]=newbyte[BUFFER];
- while((count=is.read(data,0,BUFFER))!=-1){
- gos.write(data,0,count);
- }
- gos.finish();
- gos.flush();
- gos.close();
- }
- /**
- *文件压缩
- *
- *@parampath
- *@throwsException
- */
- publicstaticvoidcompress(Stringpath)throwsException{
- compress(path,true);
- }
- /**
- *文件压缩
- *
- *@parampath
- *@paramdelete
- *是否删除原始文件
- *@throwsException
- */
- publicstaticvoidcompress(Stringpath,booleandelete)throwsException{
- Filefile=newFile(path);
- compress(file,delete);
- }
- /**
- *数据解压缩
- *
- *@paramdata
- *@return
- *@throwsIOException
- *@throwsException
- */
- publicstaticbyte[]decompress(byte[]data)throwsIOException{
- ByteArrayInputStreambais=newByteArrayInputStream(data);
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- //解压缩
- decompress(bais,baos);
- data=baos.toByteArray();
- baos.flush();
- baos.close();
- bais.close();
- returndata;
- }
- /**
- *文件解压缩
- *
- *@paramfile
- *@throwsException
- */
- publicstaticvoiddecompress(Filefile)throwsException{
- decompress(file,true);
- }
- /**
- *文件解压缩
- *
- *@paramfile
- *@paramdelete
- *是否删除原始文件
- *@throwsException
- */
- publicstaticvoiddecompress(Filefile,booleandelete)throwsException{
- FileInputStreamfis=newFileInputStream(file);
- FileOutputStreamfos=newFileOutputStream(file.getPath().replace(EXT,
- ""));
- decompress(fis,fos);
- fis.close();
- fos.flush();
- fos.close();
- if(delete){
- file.delete();
- }
- }
- /**
- *数据解压缩
- *
- *@paramis
- *@paramos
- *@throwsIOException
- *@throwsException
- */
- publicstaticvoiddecompress(InputStreamis,OutputStreamos)throwsIOException
- {
- GZIPInputStreamgis=newGZIPInputStream(is);
- intcount;
- bytedata[]=newbyte[BUFFER];
- while((count=gis.read(data,0,BUFFER))!=-1){
- os.write(data,0,count);
- }
- gis.close();
- }
- /**
- *文件解压缩
- *
- *@parampath
- *@throwsException
- */
- publicstaticvoiddecompress(Stringpath)throwsException{
- decompress(path,true);
- }
- /**
- *文件解压缩
- *
- *@parampath
- *@paramdelete
- *是否删除原始文件
- *@throwsException
- */
- publicstaticvoiddecompress(Stringpath,booleandelete)throwsException{
- Filefile=newFile(path);
- decompress(file,delete);
- }
- }
SerializeUtil.java
- packageorg.test.demo;
- importjava.io.BufferedInputStream;
- importjava.io.ByteArrayInputStream;
- importjava.io.ByteArrayOutputStream;
- importjava.io.IOException;
- importjava.io.ObjectInputStream;
- importjava.io.ObjectOutputStream;
- importjava.io.UnsupportedEncodingException;
- importjava.util.Map;
- /**
- *于对java数据进行序列化和反序列化处理
- *@author:
- *@update:2012-4-12上午8:34:47
- */
- publicclassSerializeUtil{
- publicfinalstaticStringCHARSET_ISO88591="iso-8859-1";
- /**
- *@Title:serialize
- *@Description:java对象序列化<br>
- *eg:<br>
- *Map<String,String>map=newHashMap<String,String>();<br>
- *map.put("test","序列化");<br>
- *StringserializedMapStr=SerializeUtil.serialize(map);
- *@paramoriginal要进行序列化的java对象
- *@returnString序列化的后的值
- *@throwsIOException
- *
- *
- */
- publicstaticStringserialize(Objectoriginal)throwsIOException{
- if(null==original)returnnull;
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- ObjectOutputStreamoos=newObjectOutputStream(baos);
- oos.writeObject(original);
- byte[]str=baos.toByteArray();
- oos.close();
- baos.close();
- returnnewString(str,CHARSET_ISO88591);
- }
- /**
- *@Title:deserialize
- *@Description:序列化的String对象的反序列化<br>
- *需要自己进行强制转换得到最终类型<br>
- *eg:<br>
- *Mapnewmap=(Map)SerializeUtil.deserialize(serializedMapStr);
- *@paramserializedstr经序列化处理过的信息
- *@returnObject反序列化后生成的Object。<br>
- *@throwsIOException
- *@throwsUnsupportedEncodingException
- *@throwsClassNotFoundException
- *
- *
- */
- publicstaticObjectdeserialize(Stringserializedstr)throwsUnsupportedEncodingException,IOException,ClassNotFoundException{
- if(null==serializedstr)returnnull;
- BufferedInputStreambis=newBufferedInputStream(newByteArrayInputStream(serializedstr.getBytes(CHARSET_ISO88591)));
- ObjectInputStreamois=newObjectInputStream(bis);
- Objectobj=ois.readObject();
- ois.close();
- bis.close();
- returnobj;
- }
- publicstaticbyte[]objectToByteArray(Objectoriginal)throwsIOException{
- if(null==original)
- returnnull;
- ByteArrayOutputStreambout=newByteArrayOutputStream();
- try(ObjectOutputStreamoout=newObjectOutputStream(bout);){
- oout.writeObject(original);
- }
- returnbout.toByteArray();
- }
- @SuppressWarnings("unchecked")
- publicstaticMap<String,Object>byteArrayToObject(byte[]bytearry)throwsIOException,ClassNotFoundException{
- if(bytearry.length==0)returnnull;
- return(Map<String,Object>)newObjectInputStream(newByteArrayInputStream(bytearry)).readObject();
- }
- }
当然你序列化的类型不一定就是map,也可能是其他类型,这个要根据你的实际需要来改写SerializeUtil.java,直接返回Object类型
测试类:
- packageorg.util.test;
- importjava.util.Map;
- importjava.util.HashMap;
- importjavax.servlet.http.Cookie;
- importjunit.framework.TestCase;
- importjava.util.String;
- importorg.test.demo.EncryptUtil;
- importorg.test.demo.GZipUtils;
- importorg.test.demo.SerializeUtil;
- publicclassMainTestextendsTestCase{
- publicvoidtestToCookie()throwsException{
- Map<String,Human>map=newHashMap<String,Human>();
- map.put("test","test");
- map.put("test2",123);
- map.put("test3",newCookie("cookie","cookievalue"));
- Stringdatatemp=newString(GZipUtils.compress(SerializeUtil.objectToByteArray(map)),SerializeUtil.CHARSET_ISO88591);
- Stringstr=EncryptUtil.encrypt(datatemp,"123");
- System.out.println("加密后:"+str);
- Stringstr2=EncryptUtil.decrypt(str,"123");
- System.out.println("解密后"+SerializeUtil.byteArrayToObject(GZipUtils.decompress(str2.getBytes(SerializeUtil.CHARSET_ISO88591))));
- }
- }