java zip加密_java实现zip的加密、解密 | 学步园

//1、备份(加密)

package com.koalii.eseal.backup.struts.action;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionMapping;

import org.bouncycastle.util.encoders.Base64;

import com.koalii.core.struts.action.BaseAction;

import com.koalii.eseal.admin.dto.AdminDTO;

import com.koalii.eseal.backup.struts.form.BackUpForm;

import com.koalii.eseal.log.util.LogUtil;

import com.koalii.eseal.util.KeyUtil;

import com.koalii.eseal.util.ParameterConstant;

import com.koalii.eseal.util.ZipUtil;

import com.koalii.quickstart.util.AppConstant;

/**

* BackUpAction.java

*

* @CopyRight KOAL Co. Lmt 2009

* @author zhengxd

* @Since

* @version

* @Date: 2009-7-8

*/

public class BackUpAction extends BaseAction{

protected Object actionExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

// TODO Auto-generated method stub

ZipUtil zip = new ZipUtil();

BackUpForm backForm = (BackUpForm)form;

String filePath = request.getRealPath("/")+ParameterConstant.FILE_PATH;//ParameterConstant.FILE_PATH=“koalii”

String  zipPath = filePath+".zip";

zip.zip(zipPath, filePath);

//获得登陆用户信息

String pass = String.valueOf(backForm.getPassWord());

//加密密码  返回固定的28位长度的数组

byte bytepass [] = new String(Base64.encode( KeyUtil.keyStorePassDgtByte(pass.getBytes()))).getBytes();

// 读取文件流

javax.servlet.ServletOutputStream out = response.getOutputStream();

java.io.FileInputStream fileInputStream = new java.io.FileInputStream(

zipPath);

// 下载文件

// 设置响应头和下载保存的文件名

String filename = "koalii.zip";

if (filename != null && filename.length() > 0) {

response.setContentType("application/x-msdownload");

response.setHeader("Content-Disposition", "attachment; filename="

+ new String(filename.getBytes("utf-8"),

"iso8859-1") + "");

if (fileInputStream != null) {

int filelen = fileInputStream.available();

// 文件太大时内存不能一次读出,要循环

//创建新数组,用于存储密码流+文件流

byte a[] = new byte[filelen+bytepass.length];

//arraycopy(被复制的数组, 从第几个元素开始复制, 要复制到的数组, 从第几个元素开始粘贴, 一共需要复制的元素个数);

System.arraycopy(bytepass, 0, a, 0, bytepass.length);

fileInputStream.read(a,bytepass.length,filelen);

byte enbyte []=Base64.encode(a);

out.write(enbyte);

}

fileInputStream.close();

out.close();

}

return null;

}

}

//2、恢复(解密)

package com.koalii.eseal.recover.struts.action;

import java.io.FileOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;

import org.apache.struts.action.ActionErrors;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.ActionMessage;

import org.apache.struts.upload.FormFile;

import org.bouncycastle.util.encoders.Base64;

import com.koalii.core.struts.action.BaseAction;

import com.koalii.eseal.admin.dto.AdminDTO;

import com.koalii.eseal.log.util.LogUtil;

import com.koalii.eseal.recover.struts.form.RecoverForm;

import com.koalii.eseal.util.KeyUtil;

import com.koalii.eseal.util.ParameterConstant;

import com.koalii.eseal.util.ZipUtil;

import com.koalii.quickstart.util.AppConstant;

/**

* RecoverAction.java

*

* @CopyRight KOAL Co. Lmt 2009

* @author zhengxd

* @Since

* @version

* @Date: 2009-7-8

*/

public class RecoverAction extends BaseAction{

protected Object actionExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

// TODO Auto-generated method stub

ZipUtil zip = new ZipUtil();

RecoverForm reform = (RecoverForm)form;

FormFile file = reform.getFile();

String filePath = request.getRealPath("/")+ParameterConstant.FILE_PATH;

//获得登陆用户信息

AdminDTO user = (AdminDTO) request.getSession().getAttribute(AppConstant.userInSessionKey);

if(null==user){

super.sendMessage(request, "登陆超时,请重新登陆");

return mapping.findForward("loginout");

}

String pass = String.valueOf(reform.getPassWord());

//存储加密文件的所有数据

byte[] all = file.getFileData();

//存储解密后的所有数据

byte[] deall = Base64.decode(all);

//设置密码数组长度

byte[] passb = new byte[28];

//从解密数据中提取出密码并放入密码数组中

System.arraycopy(deall, 0, passb, 0, 28);

//将新输入的密码bsae64加码 因为在备份时 输入的密码已经做过base64加密之后才跟文件流一起做的加密

byte bytepass [] = new String(Base64.encode(KeyUtil.keyStorePassDgtByte(pass.getBytes()))).getBytes();

//判断恢复密码是否正确

if(new String(passb).equals(new String(bytepass)))

{

//将真实的文件内容提取出来并存入数组,因为密码加密后的长度是固定的28位  从第28位以后才是真实文件的内容

byte[] real = new byte[deall.length-28];

System.arraycopy(deall, 28, real, 0, real.length);

FileOutputStream out = new FileOutputStream(filePath+".zip");

//将真实文件写入磁盘

out.write(real);

out.close();

//解压真实文件

zip.unzip(filePath+".zip", filePath);

ActionErrors message = new ActionErrors();

message.add(Globals.ERROR_KEY,new ActionMessage("message", "系统恢复成功,请重新启动服务器!"));

request.getSession().setAttribute(Globals.ERROR_KEY, message);

}else{

ActionErrors message = new ActionErrors();

message.add(Globals.ERROR_KEY,new ActionMessage("message", "恢复密码不正确,请输入备份时填写的密码!"));

request.getSession().setAttribute(Globals.ERROR_KEY, message);

}

return mapping.findForward("success");

}

}

//3、zip基础类

package com.koalii.eseal.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.util.zip.ZipEntry;

import java.util.zip.ZipInputStream;

import java.util.zip.ZipOutputStream;

public class ZipUtil {

public void zip(String zipFileName, String inputFile) throws Exception {

zip(zipFileName, new File(inputFile));

}

private void zip(String zipFileName, File inputFile) throws Exception {

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(

zipFileName));

zip(out, inputFile, "");

//System.out.println("zip done");

out.close();

}

public void unzip(String zipFileName, String outputDirectory)

throws Exception {

ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));

ZipEntry z;

while ((z = in.getNextEntry()) != null) {

//System.out.println("unziping " + z.getName());

if (z.isDirectory()) {

String name = z.getName();

name = name.substring(0, name.length() - 1);

File f = new File(outputDirectory + File.separator + name);

f.mkdir();

//System.out.println("mkdir " + outputDirectory + File.separator

//  + name);

} else {

File f = new File(outputDirectory + File.separator

+ z.getName());

f.createNewFile();

FileOutputStream out = new FileOutputStream(f);

int b;

while ((b = in.read()) != -1)

out.write(b);

out.close();

}

}

in.close();

}

private void zip(ZipOutputStream out, File f, String base) throws Exception {

//System.out.println("Zipping  " + f.getName());

if (f.isDirectory()) {

File[] fl = f.listFiles();

out.putNextEntry(new ZipEntry(base + "/"));

base = base.length() == 0 ? "" : base + "/";

for (int i = 0; i < fl.length; i++) {

zip(out, fl[i], base +fl[i].getName());

}

} else {

out.putNextEntry(new ZipEntry(base));

FileInputStream in = new FileInputStream(f);

int b;

while ((b = in.read()) != -1){

out.write(b);

}

in.close();

}

}

public static void main(String[] args) {

try {

//Process process = Runtime.getRuntime().exec(new String[] { "/bin/csh", "-c","zip -P "+123456+" news.zip "+" E://test" });

ZipUtil t = new ZipUtil();

t.zip("E://test.zip", "E://test");

t.unzip("E://test.zip", "E://test1");

} catch (Exception e) {

e.printStackTrace(System.out);

}

}

}


版权声明:本文为weixin_42511557原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。