java jar包加密

上周钟哥要我写一个从国泰君安发送数据到资讯后台的程序。因为接口和数据发送的部分我已经做过很多次,在熟悉了oracle的数据库结构和sql语法之后,很快完成任务。但是由于这次程序是给公司外面的人用,程序的打包发布要求有所不同,需要更灵活的配置和安全的反编译机制。以前写的程序都是做成war包的形式放在自己的服务器上运行,而myeclipse拥有完善的war包发布功能,所以对java项目的打包原理并没有太多了解。这次自己打jar包和加密碰到了不少问题,不过最终还是顺利解决,收获不小。决定做些记录,以备后用。

  java项目的打包其实比较简单,将项目的java文件编译以后,编写一个MANIFEST.MF文件,若需要打包后的jar文件可以直接运行,需要在MANIFEST.MF中加入maniclass: 包名.类名,表明项目运行的主类

  本项目内容如下:Manifest-Version: 1.0
                 Created-By: Fat Jar Eclipse Plug-In
                 Main-Class: com.gw.sec.DecryptStart

  如果引用到外部包,需要将外部包的class解压与项目class一同打包,myeclipse的fatjar插件实现了上述功能,在解压sqljdbc驱动的过程中,因为sqljdbc.jar是签名过的jar包,解压之后破坏了签名无法使用其中的class文件,后来找到解决方法如下,先解压原版sqljdbc.jar,重写一个MANIFEST.MF,内容如下:

               Manifest-Version: 1.0
               Main-Class:
               Class-path: sqljdbc.jar

将MANIFEST文件与解压后的com文件夹放于同级目录下,然后在命令行下重新打包得到新的sqljdbc.jar,命令如下:jar -cvmf MANIFEST.MF sqljdbc.jar com

程序打包后,读取配置文件的路径与jar包在同级目录,并将jre放置与jar包同级目录下,编写bat文件:

set path=程序目录绝对路径\jre\bin

jar启动命令:java -jar .....

这样运行bat文件,系统就会调用程序目录jre下的java.exe,用户便无需自行安装jre也能运行程序,jre目录占空间比较大,90mb左右,可以视情况对目录进行精简,不必要的jar包,licence等可以删掉,只要保证程序能正常运行便可。

由于java的反编译十分方便,所以程序发布打包前应当对class文件进行加密,避免被他人反编译获取一些不希望被获取的信息。这里用到了java的jce框架,具体思路如下,通过一个keyGenerator类根据DES算法生成一个密钥文件key.data,

      String keyFilename = "key.data";
    String algorithm = "DES";

    // 生成密匙
    SecureRandom sr = new SecureRandom();
    KeyGenerator kg = KeyGenerator.getInstance( algorithm );
    kg.init( sr );
    SecretKey key = kg.generateKey();

    // 把密匙数据保存到文件
    Util.writeFile( keyFilename, key.getEncoded()

然后运行加密类EncryptClass读取密钥对指定class文件进行加密,一般加密项目class文件便可,

将解密类DecryptStart与项目class一同打包,每次要运行程序时先启动DecryptStart类,读取密钥,通过反射机制解密主类class,并调用其main方法,然后解密所调用的其他类,运行程序。

转载于:https://www.cnblogs.com/sfmjp/articles/2864908.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值