方法只适用于一些简单的小系统中,在安全性要求比较高的地方,就不适用了.且没有考虑到代码混淆部分,主要防止非技术人员对系统进行非技术方面的操作.(只防普通用户)
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个方法从不同的部分对代码进行保护.对于某些行业性的系统,有一定的保护作用.
如果你有新的方法,还请告知.
分享到:
相关推荐
为了确保拷贝过程的安全性和完整性,我们可以在拷贝前检查文件是否存在,如果目标文件已存在,可以选择覆盖或者跳过,防止数据丢失或冲突。 此外,考虑到可能的多线程问题,我们需要在拷贝过程中添加适当的同步机制...
标题中的“项目防拷贝源码.rar_项目防拷贝”指的是一个压缩包,其中包含了一套用于防止项目被非法复制或盗用的源代码。这个解决方案可能涉及到多个层次的安全措施,旨在保护开发者的知识产权。 描述中提到的“项目...
C++作为一种静态类型的编译语言,提供了优秀的性能和细粒度的内存控制,这使得它在处理高并发、低延迟的Web服务时有明显优势。 1. **C++ Web框架基础**:C++ Web框架通常包括路由系统、HTTP服务器组件、模板引擎和...
JSP是由Web服务器执行的,它将JSP页面转换为Servlet(Java类),然后编译成字节码运行。在JSP页面中,静态内容(HTML、CSS、JavaScript)与动态内容(Java代码)混合,使得页面生成和展示更加灵活。 2. **过滤器...
同时,还需要将`D:\Program Files\apache-tomcat-7.0.53\webapps\web\WEB-INF\lib`下的所有`.jar`文件及额外的`junit-3.7.0.jar`包拷贝到`E:\zkm\lib`文件夹中,以便混淆工具能正确识别和处理这些依赖。 #### 三、...
如果不想全局安装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 ``` 执行上述操作后,重新...
MySQL 是一个流行的开源关系数据库管理系统,广泛应用于 web 开发和企业应用中。安装 MySQL 数据库在 Linux 系统上需要经过一系列的步骤,包括下载安装包、解压、配置和编译、安装、创建 MySQL 相关用户、配置 MySQL...
**JSP论坛系统源代码详解...通过深入学习和实践这个JSP论坛系统源代码,不仅可以提升你的JSP编程技能,还能增强对Web应用架构的理解,为未来的项目开发打下坚实的基础。站在巨人的肩膀上,我们可以看得更远,走得更稳。
先将此目录下的“feng”目录拷贝到你的虚拟目录下的:WEB-INFclasses下。 本系统这里使用的ACCESS数据数据库。 数据源名称:count,用户名:admin,密码:admin (也可以改变jdbc.java 文件的代码,然后编译)。...
6. **部署与运行**:在实际应用中,要使MIS系统正常运行,除了拷贝BIN文件夹中的文件和Web.config之外,还需要确保IIS(Internet Information Services)服务器已安装并配置正确,.Net Framework 4.0已安装,并且...
编译内核时,进入/sys/i386/conf目录,拷贝GENERIC配置文件,并以此为基础修改内核配置,然后编译内核。在编译过程中,需要加入特定的参数,如“#disablectrl+alt+deleteop”,以便关闭不必要的系统功能。 升级操作...
硬件要求: 对硬件没有特别的要求,但推荐为了取得良好的效果,防止编译、运行出错,建议配置如下:CPU :≥Pentium 300MHz内 存:≥128M显 卡:支持800×600×16位色以上显示光 驱:≥24倍速声 卡:Soundblaster ...
将so文件拷贝到AVD的/system/lib目录下(这里需要AVD的root权限,但是adb shell 就是root权限,所以用adb 指令来拷贝): 用cmd窗口 启动AVD(必须的,否则会有out of memory错误),输入:CMD指令: emulator -avd m9 -...
- 它还提供了类型安全和安全性的特性,有助于防止常见的编程错误。 **1.4 小结** - 本章介绍了.NET的概念以及C#语言如何适应.NET平台。.NET为开发者提供了一个强大的环境来创建高效的应用程序,而C#则作为.NET的...
### 在LNMP环境下搭建Cacti及遇到的问题与解决方法 #### 一、概述 Cacti是一款基于Web的网络流量监控工具,它利用RRDTool来存储和展示网络设备的流量统计数据。Cacti可以收集来自SNMP的流量数据,并通过MySQL...
先将此目录下的“feng”目录拷贝到你的虚拟目录下的:\\WEB-INF\classes\下。 本系统这里使用的ACCESS数据数据库。 数据源名称:count,用户名:admin,密码:admin (也可以改变jdbc.java 文件的代码,然后编译)...
POS系统,全称为Point of Sale,是零售业中用于销售交易处理的系统。在本文中,我们将详细讨论如何进行POS系统的升级,特别是针对...在执行升级前,建议做好充分的备份工作,以防止任何可能的数据丢失或系统故障。
通过JNI,开发者可以编写Java应用程序来调用本地方法,这些本地方法通常是用C或C++编写的,并被编译成动态链接库(DLL)或其他平台对应的库文件。 #### 二、Java-JNI调用动态库获取硬件信息制作软件加密步骤详解 **1...
避免无限制地遍历所有文件可能导致的性能问题,同时保护用户数据的安全,防止恶意拷贝或者病毒感染。 8. **异常处理**:考虑到可能出现的错误情况,如文件不存在、磁盘满、U盘被拔出等情况,需要进行异常处理,确保...