`
longgangbai
  • 浏览: 7349753 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

防止java反编译的一点想法

阅读更多

      为了企业的代码的安全,可以在打包之前将类文件加密之后,打包成相关的文件,在加载时,获取类文件信息,并解密加载到JVM中。

 关于实现的代码如下:

 

package com.easyway.space.commons.classloaders.security;

import static com.easyway.space.commons.classloaders.security.CommonSpaceConstant.SECURITY_KEY_FILE_LOCATION_KEY;
import static com.easyway.space.commons.classloaders.security.CommonSpaceConstant.SYSTEMCONFIG_FILE_LOCATION;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;


/**
 * 
 * 类安全加载工具类
 * @author longgangbai
 *
 */
public class ClassSecurityUtils { 
	
	public static  Logger logger=Logger.getLogger(ClassSecurityUtils.class); 
	public static String SECURITY_KEY_FILE_LOCATION;
	static{
		SECURITY_KEY_FILE_LOCATION =PropertiesUtils.getProperties(SYSTEMCONFIG_FILE_LOCATION).getProperty(SECURITY_KEY_FILE_LOCATION_KEY);
	}
	/**
	 * 将客户端的jar文件通过循环依次加密
	 * @param clazzPath  类文件路径
	 * @throws Exception
	 */
    public static void cryptClass(String clazzPath) throws Exception {
        //获取密钥信息
        FileInputStream fi = new FileInputStream(new File(SECURITY_KEY_FILE_LOCATION));
        byte rawKeyData[]=IOUtils.toByteArray(fi);
        //创建加密的对象
        SecureRandom sr = new SecureRandom();
        DESKeySpec dks = new DESKeySpec(rawKeyData);
        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, key, sr);
        //获取class文件加密前的信息
        File clazzFile=new File(clazzPath);
        FileInputStream fi2 = new FileInputStream(clazzFile);
        byte data[] = IOUtils.toByteArray(fi2);
        //获取加密之后的信息并写入文件
        byte encryptedData[] = cipher.doFinal(data);
        FileOutputStream fo = new FileOutputStream(clazzFile);
        IOUtils.write(encryptedData, fo);
    }
	/**
	 * 
	 * 用于解析加密过的class文件的并加载到JVM中
	 * @param filepath   密钥文件的路径
	 * @param clazzPath  需要解密的classpath文件的路径
	 * @param clazzLoader  相应的类加载器
	 * @throws InvalidKeyException  
	 * @throws InvalidKeySpecException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 * @throws ClassNotFoundException
	 */
	public static void decryptClass(String filepath,String clazzPath,CustomerClassLoader clazzLoader) throws InvalidKeyException, InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, ClassNotFoundException{
          //获取密钥文件的信息
		  File file=new File(filepath);
		  //获取Class 文件的信息
		   File clazzFile=new File(clazzPath);
       if(file.exists()){
		try {
			   //获取密钥的信息
			   byte rawKeyData[] = FileUtils.readFileToByteArray(file);
			   //设置安全算法的密钥
			   SecureRandom sr = new SecureRandom();
	   		   DESKeySpec dks = new DESKeySpec(rawKeyData);
	   		   //采用DES加密的算法
	   		   SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);
	   		   Cipher cipher = Cipher.getInstance("DES");
	   		   //初始化密钥对象
	   		   cipher.init(Cipher.DECRYPT_MODE, key, sr);
	   		   if(clazzFile.exists())
	   		   {
	   			   //获取加密之前的文件的信息
	   			  byte rawEncryptedClassData[] =  FileUtils.readFileToByteArray(clazzFile);
	   			  //解密加密文件的信息
	   			  byte decryptedClazzData[] = cipher.doFinal(rawEncryptedClassData);
	   			  //通过类加载器加载类到JVM中
	   			  String className=clazzFile.getName();
	   			  
	   			  clazzLoader.loadClass(decryptedClazzData, className);
	   		   }
		} catch (IOException e) {
			logger.error("解析加载文件"+clazzFile.getName(), e);
		}
       }
	}


}

 

分享到:
评论
1 楼 ybw31549490 2011-11-07  
加密后影响实际编程调用jar包内的方法吗?

相关推荐

    java代码保护,防止反编译

    "Java代码保护,防止反编译" 本文讨论了Java程序的保护方法,以防止反编译和盗版。由于Java语言的特点,使得反编译变得非常容易。因此,保护Java程序变得非常重要。本文首先讨论了保护Java程序的基本方法,然后对...

    java反编译工具

    Java反编译工具是开发者在特定情况下非常有用的工具,它能够将已经编译好的.class文件转换回源代码的.java文件。这种技术对于软件维护、学习他人代码、逆向工程或者理解已有的二进制库的工作原理都至关重要。本文将...

    咖啡图形的java反编译工具(实用)

    Java反编译是将已编译的Java字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解已加密或混淆的代码、逆向工程库或者研究软件内部工作原理非常有用。这款名为“咖啡图形的java反编译工具”很可能是一...

    JAVA反编译软件(可将class文件反编译为java文件)

    Java反编译是Java开发中一个重要的辅助工具,它能够帮助开发者查看已编译的`.class`文件中的源代码,即使原始的`.java`源文件已经丢失或未被提供。这个过程对于理解类库的工作原理、逆向工程、调试、学习或者分析...

    java反编译程序

    Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程。在开发或维护项目时,如果原始的源代码丢失或不可用,反编译工具就能派上用场。这些工具可以帮助开发者理解代码的功能,修复错误,...

    防止java反编译的一些方法

    ### 防止Java反编译的策略与技术解析 #### 概述 在软件开发领域,保护代码免受逆向工程(反编译)的威胁是至关重要的,尤其是在Java编程语言中,因其字节码的特性使得其相对易于被反编译。本文将深入探讨几种常用...

    jd-gui最好的JAVA反编译工具

    此时,就需要用到反编译工具,而jd-gui就是这样一款强大的JAVA反编译工具。它以其简单易用、功能齐全的特点,深受广大开发者喜爱。 首先,jd-gui是一款开源的Java反编译工具,能够将字节码还原为接近原始的Java源...

    JAVA反编译文件解决中文乱码

    在Java开发过程中,有时我们需要查看或分析已编译的.class文件中的源代码,这就涉及到Java的反编译技术。反编译是将字节码还原为接近原生的源代码的过程,常用工具有JD-GUI,它是一款直观的Java反编译器。然而,当...

    java jar反编译工具 java Class反编译工具

    本篇文章将详细介绍Java的jar反编译工具——JD-GUI以及如何使用它来反编译Java Class文件。 JD-GUI是一款直观的图形用户界面工具,专门用于反编译Java的Class文件,从而帮助开发者查看和理解字节码背后的源代码。它...

    Java反编译工具jui

    Java反编译是Java开发中一个重要的辅助工具,主要用于查看和理解Java字节码,将已编译的.class文件或.jar文件转换回源代码形式。这在进行逆向工程、学习开源项目、修复bug或者理解未知代码的工作流程时非常有用。...

    jd-gui java反编译的工具,非常好用

    java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译...

    java反编译工具 jad

    jad 是应用最广泛的java 反编译工具;其本身是命令行工具;其他很多用具是在jad内核的基础上加了一个图形界面;比如我上传的资源、Cavaj Java Decompiler  以下假设jad.exe在c:\java目录下  一、基本用法  ...

    java反编译工具 java反编译工具

    Java反编译是将已编译的Java字节码(.class文件)转换回源代码的过程,这在软件开发、逆向工程、调试和学习他人的代码时非常有用。Java的字节码并不直接对应于源代码,因此需要特定的工具来实现反编译。这些工具可以...

    JAVA反编译和unicode转字符.rar

    Java反编译与Unicode字符转换是Java开发过程中两个重要的技术环节。反编译是指将已编译的字节码(.class文件)转换回源代码的过程,这对于理解已有的类库或者进行逆向工程非常有用。Unicode是国际通用的字符编码标准,...

    安卓、Java反编译工具

    本文将深入探讨“安卓、Java反编译工具”这一主题,包括它们的工作原理、常用的反编译工具以及如何使用这些工具来解析编译过的文件。 首先,我们需要理解编译和反编译的基本概念。编译是将源代码(如Java或Android...

    JAVA反编译包_小茶杯_jd-gui-1.6.6.jar.7z

    Java反编译是将已编译的字节码文件(.class)转换回源代码的过程,主要用于学习、分析和理解他人的代码,或者在没有源代码的情况下修复bug。"JAVA反编译包_小茶杯_jd-gui-1.6.6.jar.7z" 是一个包含Java反编译工具JD-...

    mac版本java反编译JD-GUI

    Java反编译是将已编译的Java字节码转换回源代码的过程,这对于理解类库的工作原理、学习代码实现或者在没有源代码的情况下调试二进制程序非常有用。JD-GUI是一款流行的Java反编译工具,尤其适用于Mac用户。在本文中...

    mac 版本 java反编译工具jd-gui

    Java反编译是将已编译的Java字节码(.class文件)转换回源代码的过程,这对于理解或学习已封装的库、框架或者解决逆向工程问题非常有用。在Mac操作系统上,一个常见的Java反编译工具是JD-GUI。JD-GUI是一款图形化...

Global site tag (gtag.js) - Google Analytics