Java/Security/Check sum

Материал из Java эксперт
Перейти к: навигация, поиск

Check Sum and MD5

  
/*
 *************************************************************************
 * The contents of this file are subject to the Openbravo  Public  License
 * Version  1.0  (the  "License"),  being   the  Mozilla   Public  License
 * Version 1.1  with a permitted attribution clause; you may not  use this
 * file except in compliance with the License. You  may  obtain  a copy of
 * the License at http://www.openbravo.ru/legal/license.html 
 * Software distributed under the License  is  distributed  on  an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific  language  governing  rights  and  limitations
 * under the License. 
 * The Original Code is Openbravo ERP. 
 * The Initial Developer of the Original Code is Openbravo SL 
 * All portions are Copyright (C) 2009 Openbravo SL 
 * All Rights Reserved. 
 * Contributor(s):  ______________________________________.
 ************************************************************************
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.Properties;
public class CheckSum {
  private String obDir;
  private Properties properties;
  public CheckSum(String dir) {
    obDir = dir.replace("\\", "/");
    if (!obDir.endsWith("/"))
      obDir += "/";
    properties = new Properties();
    File propertiesFile = new File(obDir + "/config/checksums");
    if (propertiesFile.exists()) {
      try {
        properties.load(new FileInputStream(propertiesFile));
      } catch (Exception e) {
        // do nothing, just do not read properties
      }
    }
  }
  private void getCheckSum(MessageDigest cs, File f) throws Exception {
    if (f.isDirectory()) {
      File[] list = f.listFiles(new FilenameFilter() {
        public boolean accept(File file, String s) {
          return !s.equals(".svn");
        }
      });
      for (File element : list)
        getCheckSum(cs, element);
    } else {
      FileInputStream is = new FileInputStream(f);
      byte[] bytes = new byte[1024];
      int len = 0;
      // Checksum file directly
      while ((len = is.read(bytes)) >= 0) {
        cs.update(bytes, 0, len);
      }
      is.close();
    }
  }
  private String getCheckSum(String[] files) throws Exception {
    MessageDigest cs = MessageDigest.getInstance("MD5");
    for (String fileName : files) {
      File file = new File(fileName);
      if (file.exists())
        getCheckSum(cs, file);
    }
    return new BigInteger(1, cs.digest()).toString(16);
  }
  private String[] getFiles(String type) {
    if (type.equals("md5.db.structure")) {
      String rt[] = { obDir + "src-db/database/model", obDir + "modules" };
      return rt;
    } else if (type.equals("md5.db.sourcedata")) {
      String rt[] = { obDir + "src-db/database/sourcedata", obDir + "modules" };
      return rt;
    } else if (type.equals("md5.wad")) {
      String rt[] = { obDir + "src-wad/lib/openbravo-wad.jar" };
      return rt;
    } else if (type.equals("md5.skins")) {
      String rt[] = { obDir + "web/skins" };
      return rt;
    } else {
      String rt[] = new String[0];
      return rt;
    }
  }
  private void saveCheckSum() throws Exception {
    FileOutputStream file = new FileOutputStream(obDir + "/config/checksums");
    properties.store(file, "Checksums for build tasks comparation");
  }
  public String calculateCheckSum(String type) {
    try {
      String[] files = getFiles(type);
      String checkSum = getCheckSum(files);
      properties.setProperty(type, checkSum);
      saveCheckSum();
      return checkSum;
    } catch (Exception e) {
      e.printStackTrace();
      return "0";
    }
  }
  public String calculateCheckSumDBStructure() {
    return calculateCheckSum("md5.db.structure");
  }
  public String calculateCheckSumDBSourceData() {
    return calculateCheckSum("md5.db.sourcedata");
  }
  public String calculateCheckSumWad() {
    return calculateCheckSum("md5.wad");
  }
  public String calculateCheckSkins() {
    return calculateCheckSum("md5.sinks");
  }
  public String getCheckSumDBSTructure() {
    return properties.getProperty("md5.db.structure", "0");
  }
  public String getCheckSumDBSourceData() {
    return properties.getProperty("md5.db.sourcedata", "0");
  }
  public String getCheckSumWad() {
    return properties.getProperty("md5.wad", "0");
  }
  public String getCheckSum(String type) {
    return properties.getProperty(type, "0");
  }
  public static void main(String[] args) {
    CheckSum cs = new CheckSum("/home/openbravo/ws/trunk/openbravo");
    cs.calculateCheckSum("md5.skins");
  }
}





Generates md5-sums based on a string

  

import java.security.MessageDigest;
import java.security.DigestInputStream;
import java.io.InputStream;
import java.io.BufferedInputStream;
public class MD5Util {
    public static String computeMD5(String input) {
        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("MD5");
            digest.update(input.getBytes("UTF-8"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        byte[] digestBytes = digest.digest();
        StringBuffer hexString = new StringBuffer();
        for (byte digestByte : digestBytes) {
            hexString.append(Integer.toHexString(0xFF & digestByte));
        }
        return hexString.toString();
    }
    public static String computeMD5(InputStream stream) {
        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("MD5");
            DigestInputStream digestStream = new DigestInputStream(stream, digest);
            while (digestStream.read() != -1) {
                ; //digest is updating
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        byte[] digestBytes = digest.digest();
        StringBuffer hexString = new StringBuffer();
        for (byte digestByte : digestBytes) {
            hexString.append(Integer.toHexString(0xFF & digestByte));
        }
        return hexString.toString();
    }
}