`
chengzhi
  • 浏览: 112310 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

WEB系统防止拷贝编译的一点方法

    博客分类:
  • java
阅读更多

方法只适用于一些简单的小系统中,在安全性要求比较高的地方,就不适用了.且没有考虑到代码混淆部分,主要防止非技术人员对系统进行非技术方面的操作.(只防普通用户)
    1,数据库
    现在基本上都把用户名和密码放在配置文件中,所以将连接数据放在程序里已不适实际.于是考虑在进行数据连接的代码中,将读出的数据进行另一种运算(解密)而得到实际的数据.如下图所示:

Xml代码
<driver-properties>  
    <property name="decrypt" value="true"/>  
    <property name="user" value="root"/>  
    <property name="password" value="4akslkslksiwx3fr24sef"/>  
</driver-properties>  
<driver-properties>
 <property name="decrypt" value="true"/>
 <property name="user" value="root"/>
 <property name="password" value="4akslkslksiwx3fr24sef"/>
</driver-properties>
     简单起见,只对密码进行了处理.实际密码为123456,而生成的密码根据
     配置文件中的密码,即是加密之后的密码,原密码为(123456).
     配置文件中的decrypt,即是是否解密的配置,当值为true时,表示为需要解密.而为false时,表示为不解密.
    在开发的时候,将decrypt置为false,并以明文密码开发;而在实际部署时,将密码进行加密处理之后,覆盖相应的配置文件.以达到数据库连接加密的目的.
 参考代码如下:

Java代码
String x = properties.getProperty("decrypt");   
if(x != null && x.equals("true")) {   
    String password = properties.getProperty("password");   
    if(password != null && password.length() > 0) {   
    String passwordTemp = new String(SingleCipher.getDefaultCipher().decrypt(SingleCipher.hex2byte(password)));   
    properties.remove("decrypt");   
    properties.setProperty("password", passwordTemp);   
}  
String x = properties.getProperty("decrypt");
if(x != null && x.equals("true")) {
 String password = properties.getProperty("password");
 if(password != null && password.length() > 0) {
 String passwordTemp = new String(SingleCipher.getDefaultCipher().decrypt(SingleCipher.hex2byte(password)));
 properties.remove("decrypt");
 properties.setProperty("password", passwordTemp);
}     2,程序
     这里主要讨论的是在系统运行之中,在加载class文件时对文件进行解密操作再加载的情况.
     由于我们用的是tomcat,故考虑由tomcat的classLoader入手,将class的加载根据系统的需要分成两部分.对于需要进行解密加载的先进行解密(强制解密),而对于不需要的直接进行解析加载.具体方法如下:
     将需要进行加密的文件,以列表形式放在一个可配置的配置文件中,如encrypt.properties文件中.
    加密需要被加密的文件,并部署至用户系统.
    tomcat运行系统,运行加载class二进制文件时,读取配置文件,对需要解密的文件在加载时先进行解密操作,再加载文件.
   参考代码如下:
     encrypt.properties内容:

     

Java代码
com.XX.action.A.class  
com.XX.service.B.class  
com.XX.action.A.class
com.XX.service.B.class    进行解析还原数据

   

Java代码
if(encryptFileList.contains(name)) {   
//binaryContent是由tomcat加载器读出的文件二进制数据   
    binaryContent = SingleCipher.getDefaultCipher().decrypt(binaryContent);   
}  
if(encryptFileList.contains(name)) {
//binaryContent是由tomcat加载器读出的文件二进制数据
 binaryContent = SingleCipher.getDefaultCipher().decrypt(binaryContent);
}
     这样,系统的运行将需要修改的tomcat才能运行,故当用户只是将系统拷贝之后,因为新的tomcat不能直接解析加密之后的class文件,而不能启动运行.达到防止拷贝的目的.
     3,机器绑定
     主要方法就是读取机器内部特征码(目前主要考虑到mac地址),进行一系列运算,与期望值相比对.如果符合,则表示目的机器是符合要求的,否则抛出异常,表示不能通过验证.主要步骤如下:
     在进行程序部署的时候,由相关命令生成一个指定文件X(文件名为C:/WINDOWS/sys.key,与系统文件相混淆),文件中包含本机的相关信息.
    源程序进行一个静态方法,在程序加载运行的同时,程序开始进行方法验证.
    方法读取指定的文件X.
    方法从文件中读取相应数据.
    方法读取运行机器的mac地址,按照即定算法生成相应的验证信息.
    将新验证信息与文件X中的验证信息进行比对,如果比对成功,验证通过.否则不通过.
 参考代码如下:

读出mac地址(适用于jdk1.6):

Java代码
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();   
List<String> stringList = new ArrayList<String>();   
while(networkInterfaces.hasMoreElements()) {   
    NetworkInterface networkInterface = networkInterfaces.nextElement();   
    byte[] x = networkInterface.getHardwareAddress();   
    if(x != null) {   
        stringList.add(SingleCipher.byte2hex(x));   
        }   
    }   
return stringList.toArray(new String[stringList.size()]);  
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
List<String> stringList = new ArrayList<String>();
while(networkInterfaces.hasMoreElements()) {
 NetworkInterface networkInterface = networkInterfaces.nextElement();
 byte[] x = networkInterface.getHardwareAddress();
 if(x != null) {
  stringList.add(SingleCipher.byte2hex(x));
  }
 }
return stringList.toArray(new String[stringList.size()]); 静态验证:

Java代码
public static void vaditate() {   
    String fileName = FILE_NAME;   
    File file = new File(fileName);   
    try {   
        String random = getObject(file, 1);   
        String message = getObject(file, 2);   
        String[] mac = getMac();   
        if(mac.length == 0)   
            invalidate("no mac.");   
        for(String m : mac) {   
            String mTemp = byte2hex(SingleCipher.getDefaultCipher().encrypt((m + random).getBytes()));   
            if(mTemp.equals(message))   
                    return;   
        }   
        throw new Exception("ls");   
    } catch(Exception e) {   
            invalidate("verify error");   
    }   
}  
public static void vaditate() {
 String fileName = FILE_NAME;
 File file = new File(fileName);
 try {
  String random = getObject(file, 1);
  String message = getObject(file, 2);
  String[] mac = getMac();
  if(mac.length == 0)
   invalidate("no mac.");
  for(String m : mac) {
   String mTemp = byte2hex(SingleCipher.getDefaultCipher().encrypt((m + random).getBytes()));
   if(mTemp.equals(message))
     return;
  }
  throw new Exception("ls");
 } catch(Exception e) {
   invalidate("verify error");
 }
} 以上3个方法从不同的部分对代码进行保护.对于某些行业性的系统,有一定的保护作用.
 如果你有新的方法,还请告知.

 

分享到:
评论

相关推荐

    vb.net编写的U盘自动拷贝

    为了确保拷贝过程的安全性和完整性,我们可以在拷贝前检查文件是否存在,如果目标文件已存在,可以选择覆盖或者跳过,防止数据丢失或冲突。 此外,考虑到可能的多线程问题,我们需要在拷贝过程中添加适当的同步机制...

    项目防拷贝源码.rar_项目防拷贝

    标题中的“项目防拷贝源码.rar_项目防拷贝”指的是一个压缩包,其中包含了一套用于防止项目被非法复制或盗用的源代码。这个解决方案可能涉及到多个层次的安全措施,旨在保护开发者的知识产权。 描述中提到的“项目...

    C++ Web Framework REST API.zip

    C++作为一种静态类型的编译语言,提供了优秀的性能和细粒度的内存控制,这使得它在处理高并发、低延迟的Web服务时有明显优势。 1. **C++ Web框架基础**:C++ Web框架通常包括路由系统、HTTP服务器组件、模板引擎和...

    java web jsp留言板

    JSP是由Web服务器执行的,它将JSP页面转换为Servlet(Java类),然后编译成字节码运行。在JSP页面中,静态内容(HTML、CSS、JavaScript)与动态内容(Java代码)混合,使得页面生成和展示更加灵活。 2. **过滤器...

    web项目依赖Zelix KlassMaster工具混淆步骤

    同时,还需要将`D:\Program Files\apache-tomcat-7.0.53\webapps\web\WEB-INF\lib`下的所有`.jar`文件及额外的`junit-3.7.0.jar`包拷贝到`E:\zkm\lib`文件夹中,以便混淆工具能正确识别和处理这些依赖。 #### 三、...

    Apache2.4.2编译安装2个常见错误和解决方法

    如果不想全局安装APR,可以将APR和APRUtil的源代码拷贝到Apache源码的相应目录: ``` cp -r apr-1.4.6 httpd-2.4.2/srclib/apr cp -r apr-util-1.4.1 httpd-2.4.2/srclib/apr-util ``` 执行上述操作后,重新...

    Linux安装MySQL数据库.pdf

    MySQL 是一个流行的开源关系数据库管理系统,广泛应用于 web 开发和企业应用中。安装 MySQL 数据库在 Linux 系统上需要经过一系列的步骤,包括下载安装包、解压、配置和编译、安装、创建 MySQL 相关用户、配置 MySQL...

    JSP论坛系统源代码

    **JSP论坛系统源代码详解...通过深入学习和实践这个JSP论坛系统源代码,不仅可以提升你的JSP编程技能,还能增强对Web应用架构的理解,为未来的项目开发打下坚实的基础。站在巨人的肩膀上,我们可以看得更远,走得更稳。

    季风流量统计系统

    先将此目录下的“feng”目录拷贝到你的虚拟目录下的:WEB-INFclasses下。 本系统这里使用的ACCESS数据数据库。 数据源名称:count,用户名:admin,密码:admin (也可以改变jdbc.java 文件的代码,然后编译)。...

    ExtAspNet开发的MIS框架

    6. **部署与运行**:在实际应用中,要使MIS系统正常运行,除了拷贝BIN文件夹中的文件和Web.config之外,还需要确保IIS(Internet Information Services)服务器已安装并配置正确,.Net Framework 4.0已安装,并且...

    FreebBSD升级优化全攻略.pdf

    编译内核时,进入/sys/i386/conf目录,拷贝GENERIC配置文件,并以此为基础修改内核配置,然后编译内核。在编译过程中,需要加入特定的参数,如“#disablectrl+alt+deleteop”,以便关闭不必要的系统功能。 升级操作...

    《Delphi7程序设计技巧与实例》配书光盘

    硬件要求: 对硬件没有特别的要求,但推荐为了取得良好的效果,防止编译、运行出错,建议配置如下:CPU :≥Pentium 300MHz内 存:≥128M显 卡:支持800×600×16位色以上显示光 驱:≥24倍速声 卡:Soundblaster ...

    高焕堂<应用框架原理与程序设计>源代码(Eclipse)

    将so文件拷贝到AVD的/system/lib目录下(这里需要AVD的root权限,但是adb shell 就是root权限,所以用adb 指令来拷贝): 用cmd窗口 启动AVD(必须的,否则会有out of memory错误),输入:CMD指令: emulator -avd m9 -...

    C# 入门教程_源码可拷贝 (免积分大放送)

    - 它还提供了类型安全和安全性的特性,有助于防止常见的编程错误。 **1.4 小结** - 本章介绍了.NET的概念以及C#语言如何适应.NET平台。.NET为开发者提供了一个强大的环境来创建高效的应用程序,而C#则作为.NET的...

    在lnmp环境下搭建cacti

    ### 在LNMP环境下搭建Cacti及遇到的问题与解决方法 #### 一、概述 Cacti是一款基于Web的网络流量监控工具,它利用RRDTool来存储和展示网络设备的流量统计数据。Cacti可以收集来自SNMP的流量数据,并通过MySQL...

    0510_jspcount.rar

    先将此目录下的“feng”目录拷贝到你的虚拟目录下的:\\WEB-INF\classes\下。 本系统这里使用的ACCESS数据数据库。 数据源名称:count,用户名:admin,密码:admin (也可以改变jdbc.java 文件的代码,然后编译)...

    POS升级步骤

    POS系统,全称为Point of Sale,是零售业中用于销售交易处理的系统。在本文中,我们将详细讨论如何进行POS系统的升级,特别是针对...在执行升级前,建议做好充分的备份工作,以防止任何可能的数据丢失或系统故障。

    java-JNI调用动态库获取硬件信息制作软件加密

    通过JNI,开发者可以编写Java应用程序来调用本地方法,这些本地方法通常是用C或C++编写的,并被编译成动态链接库(DLL)或其他平台对应的库文件。 #### 二、Java-JNI调用动态库获取硬件信息制作软件加密步骤详解 **1...

    U盘小偷C#源码

    避免无限制地遍历所有文件可能导致的性能问题,同时保护用户数据的安全,防止恶意拷贝或者病毒感染。 8. **异常处理**:考虑到可能出现的错误情况,如文件不存在、磁盘满、U盘被拔出等情况,需要进行异常处理,确保...

Global site tag (gtag.js) - Google Analytics