理论上讲,不存在牢不可破的漏洞,只是时间和成本问题。通常我们认为的不可破解,说的是破解需要难以接受的时间和成本。
对于java程序来说,class文件很容易被反编译,所以理论上而言,对java程序做license限制,无法真正起到保护软件被盗窃的作用。
但是,如果增加被反编译的成本,或者增加被反编译后能读懂源码的成本,也能从一定程度上起到保护软件被盗用的目的。
针对不同的应用程序,可以使用不同的方法。

1. Android应用程序
由于Android应用程序时需要下载才能被安装的,所以用户很容易可以得到程序包,且可以进行反编译。
所以只能通过增加被反编译后读懂源码的成本来达到保护程序被盗用的目的,通常的做法是进行代码混淆。

2. Web应用程序
(1)自己部署
Web应用程序通常部署在服务器端,用户能直接获取到程序源码的风险相对较小,所以就可以避免被反编译。
(2)交付给用户部署
如果想限制软件系统的功能或者使用时间,可以通过license授权的方式实现。但是,license加密和解密验证都必须在服务器端。
########### 理论上没有任何意义,只要web程序提供给用户,同样可以被反编译绕开license验证过程。###########
########### 如果一定要做license限制,一定要对license解密代码进行混淆处理。############
    
3. 关于RSA加密
公钥加密数据长度最大只能为117位,私钥加密用于数字签名,公钥验证。
通常,不直接使用RSA加密,特别是加密内容很大的时候。
使用RSA公钥加密AES秘钥,再通过AES加密数据。

【参考】
https://www.guardsquare.com/en
http://www.cnblogs.com/cr330326/p/5534915.html        ProGuard代码混淆技术详解
http://blog.csdn.net/ljd2038/article/details/51308768    ProGuard详解
http://oma1989.iteye.com/blog/1539712   Java给软件添加License
http://infinite.iteye.com/blog/238064   利用license机制来保护Java软件产品的安全
http://jasongreen.iteye.com/blog/60692    也论java加壳
http://jboss-javassist.github.io/javassist/   Javassist
http://www.cnblogs.com/duanxz/archive/2012/12/28/2837197.html  java中使用公钥加密私钥解密原理实现license控制
http://ju.outofmemory.cn/entry/98116   使用License3j实现简单的License验证

谈谈java程序代码保护及license设计的更多相关文章

  1. Java程序版权保护解决方案

    通常C.C++等编程语言开发的程序都被编译成目标代码,这些目标代码都是本机器的二进制可执行代码.通常所有的源文件被编译.链接成一个可执行文件.在这些可执行文件中,编译器删除了程序中的变量名称.方法名称 ...

  2. 谈谈Java程序员进阶的那些知识和方向

    谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...

  3. 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)

    PMD是一款采用BSD协议发布的Java程序代码检查工具.该工具可以做到检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等.该软件功能强大,扫描效率高,是Java程序员 ...

  4. Kotlin 喧嚣过后,谈谈 Java 程序员未来的出路

    http://blog.jobbole.com/111422 Java 生态圈 Java 的生态环境开放.自由,在Sun/Oracle.Google.Apache.Eclipse基金会等各大厂商,还有 ...

  5. 谈谈JAVA程序的反编译

      如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库.多媒体.CGI.及动态网页的制作方面.1999年在美国对JAVA程序员的需求量首次超过C++! 最近分析一些 ...

  6. 《Java程序性能优化》之设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  7. 寻找两个数组中的公共元素Java程序代码

    package lianxi; import java.util.*; public class UnionSearch { public static void main(String[] args ...

  8. 在java程序代码中打开文件

    class     TEST {      public  static  void  main(String[]  args){        System.out.println("He ...

  9. 如何保护java程序不被反编译

    Java是一种 跨平台的.解释型语言 Java 源代码编译中间“字节码”存储于class文件中.Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名.方法名 等.因此 ...

随机推荐

  1. vue自定义插件-弹框

    <template> <transition name="msgbox"> <div v-if="show" class=&quo ...

  2. SCOI2008着色方案(记忆化搜索)

    有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难 ...

  3. NOIP引水入城(dfs)

    为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施.水利设施有两种,分别为蓄水厂和输水站.蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中. 因此,只有与湖泊毗邻的第1 行的 ...

  4. 哈尔滨工程大学ACM预热赛 G题 A hard problem(数位dp)

    链接:https://ac.nowcoder.com/acm/contest/554/G Now we have a function f(x): int f ( int x ) {     if ( ...

  5. LOJ#2302 整数

    解:发现这苟东西是个3千万位的二进制数......毒瘤吧. 拆位考虑,如果一个地方本来是1然后+1,就会把它和它前面连续的一段1变成0,并把第一个0变成1. 如果本来是0然后-1了,就会把它和它前面连 ...

  6. MSXML2.ServerXMLHTTP responseText 获取的内容不完整,解决方案

    今天无意发现一个问题, 有个别几个网页使用 MSXML2.ServerXMLHTTP 获取网页源代码的时候,.responseText 总是返回一部分内容,无法获取完整的内容. 经过搜索,找到解决方案 ...

  7. 漫谈php框架之中间件

    市面上常见的php框架有很多,最近因为有技术需求,所以对常见的php框架的中间件进行了一些了解.各个框架尽管在目标上对php框架的定义大同小异,但是在实现方式上却各有不同,且看下文: 定义 首先什么是 ...

  8. Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机

    题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...

  9. Go数据类型和变量

    一:Go数据类型 1.1 Go语言按照分类有以下几种数据类型 布尔型 布尔型的是一个常量true或者false 数字类型 整型int和浮点型 float32, float64 字符串类型 字符串就是一 ...

  10. OpenRefine

    无论是现今的大数据还是企业内部的小数据,都存在一些普遍的问题,如数据格式不对需要转换,一个单元格内包含多个含义的内容,包含重复项等等,虽然我们也可以使用excel解决,但是excel天生有诸多限制,比 ...