由于Java代码生成的是中间过程字节码,javap以及一些反编译的工具基本能看代码的大概,对于提供给客户的代码需要做一些处理:混淆或者加密。下面分几块把在实际操作过程中参考的内容罗列出来,希望对看到本文并感兴趣的你有所帮助。
自定义ClassLoader
混淆+ClassLoader
自定义ClassLoader并用Java实现解密
- 利用DES加密的算法保護Java源代碼 为啥要加密,以及一般的保护措施(混淆、加密盘、自定义classloader)。实现有点low,用Java写的加密人家调试下就全部请求怎么弄的了。
- 运用加密技术保护Java源代码 Java实现加解密通过自定义classloader。2001年的文章啊,牛逼
- Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密 有点实践了上一篇ibm文章的意思。
自定义ClassLoader(jvmti)用C++实现解密
- ClassLoader加密技术改进研究pdf 理论派。classloader的实现用C++写(loadClass用JNI实现),但是还是需要对原有代码进行一定的修改
- 如何有效的保护 JAVA 程序 这种ClassLoader加密实现有点复杂了,还改java.c的loadClass?2002年的文章啊:解决了 ClassLoader 本身的安全性,其不失为一个比较好安全方案。
- jar包加密保护解决方案,参考。
- 通过JVMTI和JNI对JAVA加密 用jvmti来实现加解密,牛逼的一篇文章啊!一步步按他的操作可以实现,还附有源码,参考。
- http://www.oracle.com/technetwork/articles/java/jvmti-136367.html
其他一些
- java源程序加密解决方案(基于Classloader解密) 本身是一篇很棒的文章,多重加密保障ClassLoader安全。又有大神的回复:java的class加密都可以通过dumpclass来还原出来,囧
- 如何dump出一个Java进程里的类对应的Class文件? 大神的sun.jvm.hotspot.tools.jcore.ClassDump文章,只要知道类名就无敌了啊
JNI
javah
- Calling native functions from Java with JNI and Maven maven搭建native的环境,整体的结构很值得学习
- http://www.mojohaus.org/maven-native/native-maven-plugin/javah-mojo.html maven native插件
- https://stackoverflow.com/questions/25138413/java-jni-maven-native-maven-plugin-how-to-set-shared-library-final-name 从生成.h到最后打包一条龙,值得学习。
环境部署及入门
- JNI简单实现Java调用C++/C的HelloWorld 搭开发环境的时刻,可以按照步骤一步步来
- JNI_最简单的Java调用C/C++代码 直接VS建空项目,不错。思路清晰。中文入门不二之选!
- Getting started with JNI 需要小翻个墙啊,有介绍Additional Include Directories的方式配置java的头文件。
- Java programming with JNI 了解JNI没有比这篇更好的文章了,即介绍了java调c++,又介绍了c++调用java。
- VS项目配置详解 VS预定义头:DEBUG,RELEASE的一些头可以定义在配置里面。有点像makefile里面决定打什么版本。
配jni.h的 附加目录 的时刻,需要选择 配置 和 平台 的配置!!需要对应好! jni的.h文件需要放到c++的项目下面去,引用外部的好像找不到,有问题。
java与c++类型之间的转换
JNI调用C++的加密算法
- Java实现DES对称加密算法(附Android下3DES的JNI源码) 有简单介绍DES的只是。中间换成过他的DES的实现,但是感觉怪怪的,有点不太靠谱。后面换成OPENSSL了。
- JNI调用c++实现AES加密解密 android的,用的应该也是OPENSSL。可以参考过程
OPENSSL
- OpenSSL编程-对称加密及DES/3DES简介 简单的介绍
- OPENSSL库的使用-DES篇 看看算法还可以。算法介绍,有对OPENSSL DES库的介绍和使用
- OpenSSL Command-Line
- openssl 对称加密算法enc命令详解 命令行的使用
- https://www.slideshare.net/guanzhi/crypto-with-openssl
- An Introduction to OpenSSL Programming 2001年的太老了,留个纪念。
WINDOWS安装/编译安装OPENSSL然后在VS里面应用:
- https://stackoverflow.com/questions/11383942/how-to-use-openssl-with-visual-studio
- https://stackoverflow.com/questions/17127824/using-openssl-in-visual-studio-2012
- https://stackoverflow.com/questions/32156336/how-to-include-openssl-in-visual-studio-expres-2012-windows-7-x64
- http://slproweb.com/products/Win32OpenSSL.html
NuGet安装OpenSSL on VS2015-1.0.2版本:(我用的这种方式)
- https://stackoverflow.com/questions/40431034/openssl-nuget-package-not-installing-in-vs-2015 VS2015 安装openssl v1.0.2 才有v140的include。 v1.0.2.1安装不了,参考。
GCC
- How to use OpenSSL in GCC? 加依赖: -L/usr/lib -lssl -lcrypto -o server
DES
- https://my.oschina.net/mawx/blog/85424 Java DESede用C++ Openssl实现 参考下他的链接
- http://www.open-open.com/solution/view/1320502797546 Java与C++通过DES、blowfish互相加解密
- http://blog.fpmurphy.com/2010/04/openssl-des-api.html#sthash.MA71jwqK.dpbs OpenSSL DES APIs
AES
- AES加密和解密——使用openssl编程 参考他的makefile。AES用的是OPENSSL,写的中规中矩
- 密码算法详解——AES
- AES加密算法图解 flash动画很赞
- openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例) 很棒的一篇,参考。
- https://blog.poxiao.me/p/advanced-encryption-standard-and-block-cipher-mode/ 高级加密标准AES的工作模式(ECB、CBC、CFB、OFB),还有接口的介绍,非常好的一篇文章
AES CBC 相互加解密 Java/PHP/C++ java和c++加解密,互通
- AES CBC 相互加解密 Java/PHP/C++ 非常牛逼的一篇,参考。
- http://blog.sina.com.cn/s/blog_48d4cf2d0101eqdf.html Java和C/C++进行DES/AES密文传输
- https://stackoverflow.com/questions/39128103/how-do-i-decrypt-a-java-des-encrypted-message-using-openssl
- https://stackoverflow.com/questions/9038298/java-desede-encrypt-openssl-equivalent
- http://www.cnblogs.com/WonKerr/archive/2009/11/11/DES_C_JAVA.html DES 算法的 C++ 与 JAVA 互相加解密
- OpenSSL’s “enc” in Java (PBE / Password Based Encryption)
- http://openssl.6102.n7.nabble.com/Compatibility-between-Java-crypto-and-open-ssl-td13992.html
OpenSSL, RSA, AES and C++ 好鬼长复杂没怎么看,搜AES找到了。
OPENSSL MD5: VS + GCC + JAVA + 命令行
- OpenSSL MD5 Hashing Example in C++
- https://stackoverflow.com/questions/4583967/how-to-encode-md5-sum-into-base64-in-bash LINUX命令行
- https://askubuntu.com/questions/53846/how-to-get-the-md5-hash-of-a-string-directly-in-the-terminal md5sum
- https://superuser.com/questions/72765/can-you-use-openssl-to-generate-an-md5-or-sha-hash-on-a-directory-of-files 循环算一个目录下文件的MD5
- https://www.codeproject.com/Articles/1016357/OpenSSL-Tour-for-Win-Developer#DESCBC OPENSSL各种算法的使用
1 2 3 4 5 6 7 8 9 10 11 |
|
makefile
1 2 3 4 5 6 7 8 9 10 11 |
|
OPENSSL命令行
1 2 3 4 5 6 7 8 9 10 |
|
其他
SHELL二进制编码:
1 2 3 4 5 6 7 8 9 10 11 |
|
c++命令行不直接关闭。。。最后用断点的方式替代了,没找到好的方法!!
文件读写
- C++读写二进制文件
- fopen中w w+ wb区别 人家代码写的是w+,加密class后多了0D。后面问了搞C的同事才知道二进制要用wb,C就是一堆坑啊!
g++
git
重要的参考文章再列一遍
- JNI_最简单的Java调用C/C++代码
- jar包加密保护解决方案 源码JarEncrypt
- 通过JVMTI和JNI对JAVA加密
- https://stackoverflow.com/questions/40431034/openssl-nuget-package-not-installing-in-vs-2015
- AES CBC 相互加解密 Java/PHP/C++
TODO 编译打包
- http://www.tricoder.net/blog/?p=197
- https://stackoverflow.com/questions/25138413/java-jni-maven-native-maven-plugin-how-to-set-shared-library-final-name
–END