我正在研究必须保护数据(显示代码不是主要问题)文件的项目.我们正在使用Java + Netbeans.是否有任何设施将以加密格式创建jar?我们也使用sqlite作为数据库 - 因此将文本文件加密为加密格式也不适合我们.
创建加密的JAR是不可能的,因为执行的JavaVM必须能够以某种方式读取它想要执行的数据.与VM类似,任何拥有适当工具和专有技术的人都可以从JAR中提取所有数据.
如果可以加密JAR,您还必须向想要执行JAR的客户端提供一些解密密钥或工具,这完全违背了加密的目的.
你能得到的最好的是混淆,但这对雄心勃勃的攻击者来说并不是真正的安全或障碍.
我同意Kosi2801.类文件加密只是模仿安全性(请参阅http://www.excelsior-usa.com/articles/java-obfuscators.html)使用自定义ClassLoader可以破坏应用程序,例如在应用程序服务器中.
有更好的方法:在类文件中使用String常量的加密.大多数商业混淆器具有此功能,例如Allatori,Stringer Java Obfuscation Toolkit,Zelix KlassMaster,Smokescreen,DashO(超级昂贵).Stringer Java Obfuscator具有调用上下文检查和完整性控制功能,这使得保护很难被破解.
最安全的方法是在JavaCard等外部设备上存储和执行部分字节码.
NB我是Licel LLC的首席执行官.Stringer Java Obfuscator的开发人员.
Kosi2801非常适合.我能想到的唯一能做的就是以下,但它很难看.
发送小型标准JAR和加密数据文件.
当JAR运行时,它会将(某些)加密数据文件解密到内存中(就像数据在JAR中的目录一样,基本上是指针/长度对的简单内存文件系统)
设置自己的类加载器,在调用时,从JAR获取正确的加密字节(使用#2中描述的伪FS表),解密它,然后从那里加载类数据
这将允许您加载类.你可以做同样的事情(没有类加载器)来加载其他资源.
虽然实施起来很有趣(对于那些喜欢挑战的人)但是有一些问题:
您需要能够解密这些内容,因此用户每次都必须输入密码或类似的东西.如果JAR知道足以解密它的自我,那么任何人都可以查看它并弄清楚如何解密事物.这可以通过在Internet上联系已知良好的服务器来请求解密密钥(只要您使该进程安全)来减轻.当然,只要有人想要运行程序,这就需要一个活动的"网络连接".
一切都在记忆中结束.如果没有一个处理微小加密字节代码的自定义JVM(正如Cameron McKay所提到的那样),那些类最终会在某个时刻被解密.除非你依靠操作系统来阻止其他人阅读那些记忆,否则你已经失去了与他们手上一点时间的人的战斗.您尝试从某些加密存储读取的资源(例如图像/字体/等)的相同问题.
因此,你可以给人们带来复苏,让事情变得更加艰难,但在你所给予的一切情况下,你所能做的就是尽量让对方不得不投入时间.
软件保护很难,特别是像Java这样容易被反编译的东西,不能像C/Assembly那样改变它自己的代码.有一些原因,一些最昂贵的软件需要硬件加密狗或锁定到某个CPU或其他硬件.