解密日志文件工具类
时间:2022-07-24
本文章向大家介绍解密日志文件工具类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
逐行扫描,解密整行或者解密行中关键字:
import com.xxx.common.util.EncryptUtil;//相应的解密工具
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
public class LogDecryptionTool {
private static String KEY = "!@#$%^&*()_+"; //解密key
private static List<String> wordList = new ArrayList();
private static boolean usewords = false;//解密关键字,还是解密整行
private static String DES_PREFIX = "M-"; //解密生成的文件的前缀
public LogDecryptionTool() {
}
public static void main(String[] args) {
FileInputStream in = null;
try {
try {
Properties e = new Properties();
in = new FileInputStream(System.getProperty("user.dir") + "/config.properties");
e.load(in);
String logPath = e.getProperty("log.path");
KEY = e.getProperty("log.key");
DES_PREFIX = e.getProperty("log.deslogprefix");
usewords = Boolean.valueOf(e.getProperty("log.usewords")).booleanValue();
if(usewords) {
String keywords = e.getProperty("log.keywords");
String[] words = keywords.split("\|");
if(words.length == 0) {
return;
}
wordList = Arrays.asList(words);
}
System.out.println("log path: " + logPath);
decrypt(new File(logPath));
} catch (IOException var16) {
System.out.println(var16.getMessage());
}
} finally {
if(in != null) {
try {
in.close();
} catch (IOException var15) {
System.out.println(var15.getMessage());
}
}
}
}
/**
* 解密日志文件
* @param logFile
*/
public static void decrypt(File logFile) {
//文件夹,则筛选特定日志文件
if(logFile.isDirectory()) {
List files = Arrays.asList(logFile.listFiles((pathname) -> {
return pathname.getName().endsWith(".log") && !pathname.getName().startsWith(DES_PREFIX) || pathname.isDirectory() && pathname.getName().startsWith("xxx");
}));
Iterator it = files.iterator();
//递归
while(it.hasNext()) {
File file = (File)it.next();
decrypt(file);
}
} else {
(new Thread(() -> {
decrypteLog(logFile);
})).start();
}
}
//解密实际的日志文件
public static void decrypteLog(File logFile) {
String path = logFile.getAbsolutePath();
if(!path.endsWith("/") && !path.endsWith("\")) {
int lastIndex = path.lastIndexOf("/");
lastIndex = lastIndex == -1?path.lastIndexOf("\"):lastIndex;
String spath = path.substring(0, lastIndex);
String desPath = spath + "/" + "M-" + logFile.getName();
BufferedReader fbr = null;
FileReader fr = null;
FileOutputStream fo = null;
OutputStreamWriter out = null;
try {
fr = new FileReader(path);
fo = new FileOutputStream(desPath);
out = new OutputStreamWriter(fo);
fbr = new BufferedReader(fr);
System.out.println("log file " + path + " decryption begin...");
String e;
for(; (e = fbr.readLine()) != null; out.append("rn")) {
if(usewords) {
out.append(dealWords(e));
} else {
out.append(EncryptUtil.aesDecrypt(e, KEY));//使用相应的解密算法解密像一个的字段
}
}
out.flush();
System.out.println("log file " + path + " decryption over, des file path: " + desPath + " !");
} catch (Exception var18) {
System.out.println(var18.getMessage());
} finally {
try {
if(fbr != null) {
fbr.close();
}
if(out != null) {
out.close();
}
if(fr != null) {
fr.close();
}
if(fo != null) {
fo.close();
}
} catch (IOException var17) {
System.out.println(var17.getMessage());
}
}
} else {
System.out.println("file path required!");
}
}
/**
* 处理关键字解密
* @param line
* @return
*/
private static String dealWords(String line) {
String tempLine = line;
Iterator var2 = wordList.iterator();
while(var2.hasNext()) {
String word = (String)var2.next();
int wordIndex = tempLine.indexOf(word + ":");
if(wordIndex != -1) {
int endIndex = tempLine.indexOf(",", wordIndex);
if(endIndex == -1) {
endIndex = tempLine.length() - 1;
}
String tword = tempLine.substring(wordIndex + 1 + word.length(), endIndex);
String mi = EncryptUtil.aesDecrypt(tword.trim(), KEY);
tempLine = tempLine.replace(tword, mi);
}
}
return tempLine;
}
public static void testEncryptLog() {
BufferedReader fbr = null;
FileReader fr = null;
FileOutputStream fo = null;
OutputStreamWriter out = null;
try {
fr = new FileReader("D:\×××-12-05-2016-1.log");
fo = new FileOutputStream("D:\×××-12-05-2016-1.log");
out = new OutputStreamWriter(fo);
String e;
for(fbr = new BufferedReader(fr); (e = fbr.readLine()) != null; out.append("rn")) {
if(usewords) {
out.append(dealEnWords(e));
} else {
out.append(EncryptUtil.aesDecrypt(e, KEY));
}
}
out.flush();
System.out.println("en over!");
} catch (FileNotFoundException var15) {
var15.printStackTrace();
} catch (IOException var16) {
var16.printStackTrace();
} finally {
try {
if(fbr != null) {
fbr.close();
}
if(out != null) {
out.close();
}
if(fr != null) {
fr.close();
}
if(fo != null) {
fo.close();
}
} catch (IOException var14) {
var14.printStackTrace();
}
}
}
private static String dealEnWords(String line) {
String tempLine = line;
Iterator var2 = wordList.iterator();
while(var2.hasNext()) {
String word = (String)var2.next();
int wordIndex = tempLine.indexOf(word + ":");
if(wordIndex != -1) {
int endIndex = tempLine.indexOf(",", wordIndex);
if(endIndex == -1) {
endIndex = tempLine.length() - 1;
}
String tword = tempLine.substring(wordIndex + 1 + word.length(), endIndex);
String mi = EncryptUtil.aesEncrypt(tword.trim(), KEY);
tempLine = tempLine.replace(tword, mi);
}
}
return tempLine;
}
}
配置文件:
#日志文件路径
log.path=D:\
#解密密钥
log.key=!@#$%^&*()_+
log.usewords=true
#需要解密的日志内容关键字
log.keywords=token|phone|username|order id
#解密生成明文日志文件名称前缀
log.deslogprefix=M-
- Elasticsearch增删改查 之 —— Delete删除
- Elasticsearch增删改查 之 —— Get查询
- 实现两个N*N矩阵的乘法,矩阵由一维数组表示
- Elasticsearch入门必备——ES中的字段类型以及常用属性
- C++容器与算法
- Effective c++ 小结
- Java程序员的日常—— Properties文件的读写
- Java程序员的日常——经验贴(纯干货)二
- Elasticsearch——使用_cat查看Elasticsearch状态
- 题目1003:A+B ---c_str(),atoi()函数的使用;remove , erase函数的使用
- Java初学者需掌握的30个概念
- 有趣的Linux命令行效果
- 僵尸进程
- C++ 虚拟继承
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- centos6编译及安装ZLMediaKit解析
- CentOS7.5安装配置Harbor1.7的全过程
- Linux CentOS 定时运行脚本配置的方法
- 从Centos7升级到Centos8的教程(图文详解)
- Linux(Centos7)下redis5集群搭建和使用说明详解
- CentOS7下安装yum源及上传下载命令rz、sz安装方法(图解)
- C#实例:四路激光测距雷达数据采集和波形图绘制
- Linux 中有效用户组和初始用户组的实现
- ubuntu 16.04 64位兼容32位程序三步曲
- crontab执行结果未通过发送mail通知用户的方法
- 如何将CentOS7升级至CentOS8(详细步骤)
- leetcode树之二叉树的所有路径
- 如何利用Bash脚本监控Linux的内存使用情况
- Ubuntu18 给terminal改个漂亮的命令行提示符的方法
- leetcode树之将有序数组转换为二叉搜索树