Anonymizer.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:5k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.contrib.failmon;
  19. import java.io.UnsupportedEncodingException;
  20. import java.security.MessageDigest;
  21. import java.security.NoSuchAlgorithmException;
  22. /**********************************************************
  23.  * This class provides anonymization to SerializedRecord objects. It 
  24.  * anonymizes all hostnames, ip addresses and file names/paths
  25.  * that appear in EventRecords gathered from the logs
  26.  * and other system utilities. Such values are hashed using a
  27.  * cryptographically safe one-way-hash algorithm (MD5).
  28.  * 
  29.  **********************************************************/
  30. public class Anonymizer {
  31.   /**
  32.  * Anonymize hostnames, ip addresses and file names/paths
  33.    * that appear in fields of a SerializedRecord.
  34.    * 
  35.  * @param sr the input SerializedRecord
  36.  * 
  37.  * @return the anonymized SerializedRecord
  38.  */  
  39.   public static SerializedRecord anonymize(SerializedRecord sr)
  40.       throws Exception {
  41.     String hostname = sr.get("hostname");
  42.     if (hostname == null)
  43.       throw new Exception("Malformed SerializedRecord: no hostname found");
  44.     if ("true".equalsIgnoreCase(Environment
  45.         .getProperty("anonymizer.hash.hostnames"))) {
  46.       // hash the node's hostname
  47.       anonymizeField(sr, "message", hostname, "_hn_");
  48.       anonymizeField(sr, "hostname", hostname, "_hn_");
  49.       // hash all other hostnames
  50.       String suffix = Environment.getProperty("anonymizer.hostname.suffix");
  51.       if (suffix != null)
  52.         anonymizeField(sr, "message", "(\S+\.)*" + suffix, "_hn_");
  53.     }
  54.     if ("true".equalsIgnoreCase(Environment.getProperty("anonymizer.hash.ips"))) {
  55.       // hash all ip addresses
  56.       String ipPattern = "(\d{1,3}\.){3}\d{1,3}";
  57.       anonymizeField(sr, "message", ipPattern, "_ip_");
  58.       anonymizeField(sr, "ips", ipPattern, "_ip_");
  59.       // if multiple ips are present for a node:
  60.       int i = 0;
  61.       while (sr.get("ips" + "#" + i) != null)
  62.         anonymizeField(sr, "ips" + "#" + i++, ipPattern, "_ip_");
  63.       if ("NIC".equalsIgnoreCase(sr.get("type")))
  64.         anonymizeField(sr, "ipAddress", ipPattern, "_ip_");
  65.     }
  66.     if ("true".equalsIgnoreCase(Environment
  67.         .getProperty("anonymizer.hash.filenames"))) {
  68.       // hash every filename present in messages
  69.       anonymizeField(sr, "message", "\s+/(\S+/)*[^:\s]*", " _fn_");
  70.       anonymizeField(sr, "message", "\s+hdfs://(\S+/)*[^:\s]*",
  71.           " hdfs://_fn_");
  72.     }
  73.     return sr;
  74.   }
  75.   /**
  76.    * Anonymize hostnames, ip addresses and file names/paths
  77.    * that appear in fields of an EventRecord, after it gets
  78.    * serialized into a SerializedRecord.
  79.    * 
  80.    * @param er the input EventRecord
  81.    * 
  82.    * @return the anonymized SerializedRecord
  83.    */   
  84.   public static SerializedRecord anonymize(EventRecord er) throws Exception {
  85.     return anonymize(new SerializedRecord(er));
  86.   }
  87.   
  88.   private static String anonymizeField(SerializedRecord sr, String fieldName,
  89.       String pattern, String prefix) {
  90.     String txt = sr.get(fieldName);
  91.     if (txt == null)
  92.       return null;
  93.     else {
  94.       String anon = getMD5Hash(pattern);
  95.       sr.set(fieldName, txt.replaceAll(pattern, (prefix == null ? "" : prefix)
  96.           + anon));
  97.       return txt;
  98.     }
  99.   }
  100.   /**
  101.    * Create the MD5 digest of an input text.
  102.    * 
  103.    * @param text the input text
  104.    * 
  105.    * @return the hexadecimal representation of the MD5 digest
  106.    */   
  107.   public static String getMD5Hash(String text) {
  108.     MessageDigest md;
  109.     byte[] md5hash = new byte[32];
  110.     try {
  111.       md = MessageDigest.getInstance("MD5");
  112.       md.update(text.getBytes("iso-8859-1"), 0, text.length());
  113.       md5hash = md.digest();
  114.     } catch (NoSuchAlgorithmException e) {
  115.       e.printStackTrace();
  116.     } catch (UnsupportedEncodingException e) {
  117.       e.printStackTrace();
  118.     }
  119.     return convertToHex(md5hash);
  120.   }
  121.   private static String convertToHex(byte[] data) {
  122.     StringBuffer buf = new StringBuffer();
  123.     for (int i = 0; i < data.length; i++) {
  124.       int halfbyte = (data[i] >>> 4) & 0x0F;
  125.       int two_halfs = 0;
  126.       do {
  127.         if ((0 <= halfbyte) && (halfbyte <= 9))
  128.           buf.append((char) ('0' + halfbyte));
  129.         else
  130.           buf.append((char) ('a' + (halfbyte - 10)));
  131.         halfbyte = data[i] & 0x0F;
  132.       } while (two_halfs++ < 1);
  133.     }
  134.     return buf.toString();
  135.   }
  136. }