我们基于TrueLicense实现了license的校验。这块网上资料很多,在此就不加以介绍了。今天主要想说一说机器指纹的问题。
主要包括如下两部分:
1、指纹的采集生成
2、指纹的校验
我们所做的一切都是防君子不防小人,任何东东都有破解的方式方法,能做的只是增加其难度。项目中的开发语言使用的是java,由于java的跨平台特性,jvm加载执行的是字节码,字节码有一套规范,很容易进行反编译。基于此,我们做了如下工作:
使用go语言采集机器指纹信息
机器指纹是线下采集,采集的信息需要进行加密,我们使用的是的AES对称加密。目前支持:
/*****************************
*arm架构,Linux version 4.19.90-9.ky10.aarch64 (YHKYLIN-OS@kernel-rpmbuild-amd64) (gcc version 7.3.0 (GCC)) #1 SMP Sun Apr 26 11:05:59 CST 2020
*amd64架构,CentOS Linux release 7.2.1511 (Core)
******************************/
采集上来的密文,通过解密工具解密获取到明文,然后作为license的扩展参数加密存储(sm2)。
对核心的校验类进行加密
基于JVM Tool Interface对加密的类进行解密
加密和解密是对应的。由于C或者C++加解密基本都需要依赖第三方软件,没有java中那么方便。
目前项目中都要求使用国产加密算法,比如S2、S3。C++里面没有比较好的实现,高版本的openssl才支持国密算法,对于一直写java的我来说,困难比较大。其间,我们尝试了基于openssl的rsa、des加密,在c++中能正常跑的代码。使用jni调用的时候一直报错。一行一行代码排查发现此处引起的具体的原因就不知道了。
然后继续尝试别的加密方法,想使用一个简单且不依赖第三方库的算法,于是我们打算使用tea算法,简单高效。然后选择了xxtea-c尝试对class文件进行加密。
网友评论