java对象序列化、gzip压缩解压缩、加密解密

摘要:
有时在应用中需要将java对象序列化存储起来,有的需要压缩,有的需要加密EncryptUtil.javaJava代码packageorg.test.demo;importjava.io.UnsupportedEncodingException;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmExc

有时在应用中需要将java对象序列化存储起来,有的需要压缩,有的需要加密

EncryptUtil.java

Java代码收藏代码
  1. packageorg.test.demo;
  2. importjava.io.UnsupportedEncodingException;
  3. importjava.security.InvalidKeyException;
  4. importjava.security.NoSuchAlgorithmException;
  5. importjava.security.SecureRandom;
  6. importjavax.crypto.BadPaddingException;
  7. importjavax.crypto.Cipher;
  8. importjavax.crypto.IllegalBlockSizeException;
  9. importjavax.crypto.KeyGenerator;
  10. importjavax.crypto.NoSuchPaddingException;
  11. importjavax.crypto.SecretKey;
  12. importjavax.crypto.spec.SecretKeySpec;
  13. publicclassEncryptUtil{
  14. privatefinalstaticStringENCRYPTKEY="0123456789";
  15. /**
  16. *
  17. *@Title:getEncryptKey
  18. *@Description:检验加密key
  19. *@paramencryptKey
  20. *@return
  21. *String
  22. *
  23. */
  24. privatestaticStringgetEncryptKey(StringencryptKey){
  25. if(null==encryptKey||"".equals(encryptKey))returnENCRYPTKEY;
  26. returnencryptKey;
  27. }
  28. /**
  29. *
  30. *@Title:encrypt
  31. *@Description:加密:普通java字串加密成16进制字串(String->Byte->HexStr)
  32. *@paramcontent要加密处理的字串
  33. *@paramencryptKey加密密钥
  34. *@return
  35. *String
  36. *
  37. */
  38. publicstaticStringencrypt(Stringcontent,StringencryptKey){
  39. byte[]encryptResult=encryptStrToByte(content,getEncryptKey(encryptKey));
  40. returnparseByte2HexStr(encryptResult);
  41. }
  42. /**
  43. *
  44. *@Title:decrypt
  45. *@Description:加密:16进制字串解密成普通java字串(HexStr->Byte->String)
  46. *@paramcontent要解密处理的16进制字串
  47. *@paramencryptKey解密密钥
  48. *@return
  49. *String
  50. *
  51. */
  52. publicstaticStringdecrypt(Stringcontent,StringencryptKey){
  53. byte[]decryptFrom=parseHexStr2Byte(content);
  54. byte[]decryptResult=decrypt(decryptFrom,getEncryptKey(encryptKey));
  55. returnnewString(decryptResult);
  56. }
  57. /**
  58. *加密:字串-->二进制
  59. *@paramcontent需要加密的内容
  60. *@parampassword加密密码
  61. *@return
  62. */
  63. privatestaticbyte[]encryptStrToByte(Stringcontent,Stringpassword){
  64. try{
  65. KeyGeneratorkgen=KeyGenerator.getInstance("AES");
  66. kgen.init(128,newSecureRandom(password.getBytes()));
  67. SecretKeysecretKey=kgen.generateKey();
  68. byte[]enCodeFormat=secretKey.getEncoded();
  69. SecretKeySpeckey=newSecretKeySpec(enCodeFormat,"AES");
  70. Ciphercipher=Cipher.getInstance("AES");//创建密码器
  71. byte[]byteContent=content.getBytes("utf-8");
  72. cipher.init(Cipher.ENCRYPT_MODE,key);//初始化
  73. byte[]result=cipher.doFinal(byteContent);
  74. returnresult;//加密
  75. }catch(NoSuchAlgorithmExceptione){
  76. e.printStackTrace();
  77. }catch(NoSuchPaddingExceptione){
  78. e.printStackTrace();
  79. }catch(InvalidKeyExceptione){
  80. e.printStackTrace();
  81. }catch(UnsupportedEncodingExceptione){
  82. e.printStackTrace();
  83. }catch(IllegalBlockSizeExceptione){
  84. e.printStackTrace();
  85. }catch(BadPaddingExceptione){
  86. e.printStackTrace();
  87. }
  88. returnnull;
  89. }
  90. /**解密
  91. *@paramcontent待解密内容
  92. *@parampassword解密密钥
  93. *@return
  94. */
  95. privatestaticbyte[]decrypt(byte[]content,Stringpassword){
  96. try{
  97. KeyGeneratorkgen=KeyGenerator.getInstance("AES");
  98. kgen.init(128,newSecureRandom(password.getBytes()));
  99. SecretKeysecretKey=kgen.generateKey();
  100. byte[]enCodeFormat=secretKey.getEncoded();
  101. SecretKeySpeckey=newSecretKeySpec(enCodeFormat,"AES");
  102. Ciphercipher=Cipher.getInstance("AES");//创建密码器
  103. cipher.init(Cipher.DECRYPT_MODE,key);//初始化
  104. byte[]result=cipher.doFinal(content);
  105. returnresult;//加密
  106. }catch(NoSuchAlgorithmExceptione){
  107. e.printStackTrace();
  108. }catch(NoSuchPaddingExceptione){
  109. e.printStackTrace();
  110. }catch(InvalidKeyExceptione){
  111. e.printStackTrace();
  112. }catch(IllegalBlockSizeExceptione){
  113. e.printStackTrace();
  114. }catch(BadPaddingExceptione){
  115. e.printStackTrace();
  116. }
  117. returnnull;
  118. }
  119. /**将二进制转换成16进制
  120. *@parambuf
  121. *@return
  122. */
  123. privatestaticStringparseByte2HexStr(bytebuf[]){
  124. StringBuffersb=newStringBuffer();
  125. for(inti=0;i<buf.length;i++){
  126. Stringhex=Integer.toHexString(buf[i]&0xFF);
  127. if(hex.length()==1){
  128. hex='0'+hex;
  129. }
  130. sb.append(hex.toUpperCase());
  131. }
  132. returnsb.toString();
  133. }
  134. /**
  135. *将16进制转换为二进制
  136. *
  137. *@paramhexStr
  138. *@return
  139. */
  140. privatestaticbyte[]parseHexStr2Byte(StringhexStr){
  141. if(hexStr.length()<1)
  142. returnnull;
  143. byte[]result=newbyte[hexStr.length()/2];
  144. for(inti=0;i<hexStr.length()/2;i++){
  145. inthigh=Integer.parseInt(hexStr.substring(i*2,i*2+1),16);
  146. intlow=Integer.parseInt(hexStr.substring(i*2+1,i*2+2),
  147. 16);
  148. result[i]=(byte)(high*16+low);
  149. }
  150. returnresult;
  151. }
  152. }

GZipUtils.java

Java代码收藏代码
  1. packageorg.test.demo;
  2. importjava.io.ByteArrayInputStream;
  3. importjava.io.ByteArrayOutputStream;
  4. importjava.io.File;
  5. importjava.io.FileInputStream;
  6. importjava.io.FileOutputStream;
  7. importjava.io.IOException;
  8. importjava.io.InputStream;
  9. importjava.io.OutputStream;
  10. importjava.util.zip.GZIPInputStream;
  11. importjava.util.zip.GZIPOutputStream;
  12. /**
  13. *GZIP工具
  14. *
  15. */
  16. publicabstractclassGZipUtils{
  17. publicstaticfinalintBUFFER=1024;
  18. publicstaticfinalStringEXT=".gz";
  19. /**
  20. *数据压缩
  21. *
  22. *@paramdata
  23. *@return
  24. *@throwsIOException
  25. *@throwsException
  26. */
  27. publicstaticbyte[]compress(byte[]data)throwsIOException{
  28. ByteArrayInputStreambais=newByteArrayInputStream(data);
  29. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  30. //压缩
  31. compress(bais,baos);
  32. byte[]output=baos.toByteArray();
  33. baos.flush();
  34. baos.close();
  35. bais.close();
  36. returnoutput;
  37. }
  38. /**
  39. *文件压缩
  40. *
  41. *@paramfile
  42. *@throwsException
  43. */
  44. publicstaticvoidcompress(Filefile)throwsException{
  45. compress(file,true);
  46. }
  47. /**
  48. *文件压缩
  49. *
  50. *@paramfile
  51. *@paramdelete
  52. *是否删除原始文件
  53. *@throwsException
  54. */
  55. publicstaticvoidcompress(Filefile,booleandelete)throwsException{
  56. FileInputStreamfis=newFileInputStream(file);
  57. FileOutputStreamfos=newFileOutputStream(file.getPath()+EXT);
  58. compress(fis,fos);
  59. fis.close();
  60. fos.flush();
  61. fos.close();
  62. if(delete){
  63. file.delete();
  64. }
  65. }
  66. /**
  67. *数据压缩
  68. *
  69. *@paramis
  70. *@paramos
  71. *@throwsIOException
  72. *@throwsException
  73. */
  74. publicstaticvoidcompress(InputStreamis,OutputStreamos)throwsIOException
  75. {
  76. GZIPOutputStreamgos=newGZIPOutputStream(os);
  77. intcount;
  78. bytedata[]=newbyte[BUFFER];
  79. while((count=is.read(data,0,BUFFER))!=-1){
  80. gos.write(data,0,count);
  81. }
  82. gos.finish();
  83. gos.flush();
  84. gos.close();
  85. }
  86. /**
  87. *文件压缩
  88. *
  89. *@parampath
  90. *@throwsException
  91. */
  92. publicstaticvoidcompress(Stringpath)throwsException{
  93. compress(path,true);
  94. }
  95. /**
  96. *文件压缩
  97. *
  98. *@parampath
  99. *@paramdelete
  100. *是否删除原始文件
  101. *@throwsException
  102. */
  103. publicstaticvoidcompress(Stringpath,booleandelete)throwsException{
  104. Filefile=newFile(path);
  105. compress(file,delete);
  106. }
  107. /**
  108. *数据解压缩
  109. *
  110. *@paramdata
  111. *@return
  112. *@throwsIOException
  113. *@throwsException
  114. */
  115. publicstaticbyte[]decompress(byte[]data)throwsIOException{
  116. ByteArrayInputStreambais=newByteArrayInputStream(data);
  117. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  118. //解压缩
  119. decompress(bais,baos);
  120. data=baos.toByteArray();
  121. baos.flush();
  122. baos.close();
  123. bais.close();
  124. returndata;
  125. }
  126. /**
  127. *文件解压缩
  128. *
  129. *@paramfile
  130. *@throwsException
  131. */
  132. publicstaticvoiddecompress(Filefile)throwsException{
  133. decompress(file,true);
  134. }
  135. /**
  136. *文件解压缩
  137. *
  138. *@paramfile
  139. *@paramdelete
  140. *是否删除原始文件
  141. *@throwsException
  142. */
  143. publicstaticvoiddecompress(Filefile,booleandelete)throwsException{
  144. FileInputStreamfis=newFileInputStream(file);
  145. FileOutputStreamfos=newFileOutputStream(file.getPath().replace(EXT,
  146. ""));
  147. decompress(fis,fos);
  148. fis.close();
  149. fos.flush();
  150. fos.close();
  151. if(delete){
  152. file.delete();
  153. }
  154. }
  155. /**
  156. *数据解压缩
  157. *
  158. *@paramis
  159. *@paramos
  160. *@throwsIOException
  161. *@throwsException
  162. */
  163. publicstaticvoiddecompress(InputStreamis,OutputStreamos)throwsIOException
  164. {
  165. GZIPInputStreamgis=newGZIPInputStream(is);
  166. intcount;
  167. bytedata[]=newbyte[BUFFER];
  168. while((count=gis.read(data,0,BUFFER))!=-1){
  169. os.write(data,0,count);
  170. }
  171. gis.close();
  172. }
  173. /**
  174. *文件解压缩
  175. *
  176. *@parampath
  177. *@throwsException
  178. */
  179. publicstaticvoiddecompress(Stringpath)throwsException{
  180. decompress(path,true);
  181. }
  182. /**
  183. *文件解压缩
  184. *
  185. *@parampath
  186. *@paramdelete
  187. *是否删除原始文件
  188. *@throwsException
  189. */
  190. publicstaticvoiddecompress(Stringpath,booleandelete)throwsException{
  191. Filefile=newFile(path);
  192. decompress(file,delete);
  193. }
  194. }

SerializeUtil.java

Java代码收藏代码
  1. packageorg.test.demo;
  2. importjava.io.BufferedInputStream;
  3. importjava.io.ByteArrayInputStream;
  4. importjava.io.ByteArrayOutputStream;
  5. importjava.io.IOException;
  6. importjava.io.ObjectInputStream;
  7. importjava.io.ObjectOutputStream;
  8. importjava.io.UnsupportedEncodingException;
  9. importjava.util.Map;
  10. /**
  11. *于对java数据进行序列化和反序列化处理
  12. *@author:
  13. *@update:2012-4-12上午8:34:47
  14. */
  15. publicclassSerializeUtil{
  16. publicfinalstaticStringCHARSET_ISO88591="iso-8859-1";
  17. /**
  18. *@Title:serialize
  19. *@Description:java对象序列化<br>
  20. *eg:<br>
  21. *Map<String,String>map=newHashMap<String,String>();<br>
  22. *map.put("test","序列化");<br>
  23. *StringserializedMapStr=SerializeUtil.serialize(map);
  24. *@paramoriginal要进行序列化的java对象
  25. *@returnString序列化的后的值
  26. *@throwsIOException
  27. *
  28. *
  29. */
  30. publicstaticStringserialize(Objectoriginal)throwsIOException{
  31. if(null==original)returnnull;
  32. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  33. ObjectOutputStreamoos=newObjectOutputStream(baos);
  34. oos.writeObject(original);
  35. byte[]str=baos.toByteArray();
  36. oos.close();
  37. baos.close();
  38. returnnewString(str,CHARSET_ISO88591);
  39. }
  40. /**
  41. *@Title:deserialize
  42. *@Description:序列化的String对象的反序列化<br>
  43. *需要自己进行强制转换得到最终类型<br>
  44. *eg:<br>
  45. *Mapnewmap=(Map)SerializeUtil.deserialize(serializedMapStr);
  46. *@paramserializedstr经序列化处理过的信息
  47. *@returnObject反序列化后生成的Object。<br>
  48. *@throwsIOException
  49. *@throwsUnsupportedEncodingException
  50. *@throwsClassNotFoundException
  51. *
  52. *
  53. */
  54. publicstaticObjectdeserialize(Stringserializedstr)throwsUnsupportedEncodingException,IOException,ClassNotFoundException{
  55. if(null==serializedstr)returnnull;
  56. BufferedInputStreambis=newBufferedInputStream(newByteArrayInputStream(serializedstr.getBytes(CHARSET_ISO88591)));
  57. ObjectInputStreamois=newObjectInputStream(bis);
  58. Objectobj=ois.readObject();
  59. ois.close();
  60. bis.close();
  61. returnobj;
  62. }
  63. publicstaticbyte[]objectToByteArray(Objectoriginal)throwsIOException{
  64. if(null==original)
  65. returnnull;
  66. ByteArrayOutputStreambout=newByteArrayOutputStream();
  67. try(ObjectOutputStreamoout=newObjectOutputStream(bout);){
  68. oout.writeObject(original);
  69. }
  70. returnbout.toByteArray();
  71. }
  72. @SuppressWarnings("unchecked")
  73. publicstaticMap<String,Object>byteArrayToObject(byte[]bytearry)throwsIOException,ClassNotFoundException{
  74. if(bytearry.length==0)returnnull;
  75. return(Map<String,Object>)newObjectInputStream(newByteArrayInputStream(bytearry)).readObject();
  76. }
  77. }

当然你序列化的类型不一定就是map,也可能是其他类型,这个要根据你的实际需要来改写SerializeUtil.java,直接返回Object类型

测试类:

Java代码收藏代码
  1. packageorg.util.test;
  2. importjava.util.Map;
  3. importjava.util.HashMap;
  4. importjavax.servlet.http.Cookie;
  5. importjunit.framework.TestCase;
  6. importjava.util.String;
  7. importorg.test.demo.EncryptUtil;
  8. importorg.test.demo.GZipUtils;
  9. importorg.test.demo.SerializeUtil;
  10. publicclassMainTestextendsTestCase{
  11. publicvoidtestToCookie()throwsException{
  12. Map<String,Human>map=newHashMap<String,Human>();
  13. map.put("test","test");
  14. map.put("test2",123);
  15. map.put("test3",newCookie("cookie","cookievalue"));
  16. Stringdatatemp=newString(GZipUtils.compress(SerializeUtil.objectToByteArray(map)),SerializeUtil.CHARSET_ISO88591);
  17. Stringstr=EncryptUtil.encrypt(datatemp,"123");
  18. System.out.println("加密后:"+str);
  19. Stringstr2=EncryptUtil.decrypt(str,"123");
  20. System.out.println("解密后"+SerializeUtil.byteArrayToObject(GZipUtils.decompress(str2.getBytes(SerializeUtil.CHARSET_ISO88591))));
  21. }
  22. }

免责声明:文章转载自《java对象序列化、gzip压缩解压缩、加密解密》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇R语言基础-统计函数ADO.net数据访问方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Log4net配置

一 AssemblyInfo.cs文件 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 二 创建log4net.config文件 <?xml version="1.0" encoding="utf-8" ?>&...

string.format()

Lua提供了string.format()函数来生成具有特定格式的字符串, 函数的第一个参数是格式(formatstring), 之后是对应格式中每个代号的各种数据. 由于格式字符串的存在, 使得产生的长字符串可读性大大提高了. 这个函数的格式很像C语言中的printf().函数string.format在用来对字符串进行格式化的时候,特别是字符串输出,是...

statement 、prepareStatement的用法和解释

转自:http://blog.csdn.net/QH_JAVA/article/details/48245945 一、prepareStatement 的用法和解释 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Stateme...

[ PyQt入门教程 ] Qt Designer工具的使用

Qt Designer是PyQt程序UI界面的实现工具,使用Qt Designer可以拖拽、点击完成GUI界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用。本文主要通过用户登录需求描述Qt Designer工具开发界面的使用方法。 本文主要内容1、Qt Designer程序主界面窗口介绍。 2、Qt Designer程序实现界面...

CKEditor上传图片—配置CKFinder

在网站开发中,如果有发布类似新闻的图文混排需求时,CKEditor不失为一个很好的选择,下载地址如下: http://ckeditor.com/download 它的前身是FCKEditor,随着它的更新,上传图片的功能被分离出去了,现在如果需要实现上传图片,要么自己写代码,还有一种方法是使用CKFinder,下载地址如下: http://ckfinder...

java Redis读取数据方法

1. public Map<String, List<CellInfo1>>getSceneCoverCellForRedis(){ Jedis jedis = null; Map<String, List<CellInfo1>> cellMap= null;...