Java 离线授权方案

2018-06-04 18:58:37 +08:00
 Lighfer

公司开发了一个新产品,客户是在内网环境下使用的,但是我们的产品又需要卖授权,有没有人做过类似的方案呢? 目前考虑的方案是:使用非对称加密算法生成公钥和私钥,公钥保存在公司内,用于生成 licence,私钥嵌入产品内,licence 中包含机器码等信息,软件启动时加载 licence 并用私钥解密,判断机器码和使用时间等信息是否有效。 但是这个方案容易被破解,毕竟 class 反编译后私钥,licence 文件格式,授权检验等信息都藏不住,把检验的 class 文件替换掉就破裂掉了。 即使做代码混淆也不过是提高了反编译的难度而已。 技术所限,想了一天都想不到解决方案,各位有没有什么更好的方案可以提供参考呢?或者其他离线授权机制的思路?

10339 次点击
所在节点    Java
55 条回复
likuku
2018-06-04 20:27:18 +08:00
唯有在线激活(激活服务器记录保存验证客户购买和机器信息,确保任何时候客户激活的机器总数不超过许可)这种机制可以在技术上较好得应对这个状况。
cxh116
2018-06-04 20:34:06 +08:00
用硬件加密狗都能破解,只是比普通的纯软件加密难度高些。

只能像 v2 的朋友用过的方法,先让你使用,使用一段时间后突然检测是不是盗版,是盗版的话数据丢到其它隐藏表,或加密,要恢复交钱。
Lighfer
2018-06-04 21:02:20 +08:00
@likuku 唉,可惜环境不允许
Lighfer
2018-06-04 21:03:49 +08:00
@cxh116 也是,如果有完全的离线授权方案的话也不会有那么多盗版软件了。。。
ETiV
2018-06-04 21:09:42 +08:00
没用的…加密做的再好,

if (validate(license))

改成 if (true || validate(license))

就破掉了……
ahhui
2018-06-04 21:12:04 +08:00
什么?公钥存服务器?私钥随软件分发?这不是开玩笑吗?

私钥是不公开的!
私钥是不公开的!
私钥是不公开的!

重要的事情说三遍。

私钥存服务器才对啊,授权采用签名模式啊。把机器序列号(硬件信息)和软件序列号(和或产品主要文件 hash 校验指纹)一起签名了发下去。软件用公钥计算一遍校验签名就行了啊。
pabupa
2018-06-04 21:13:56 +08:00
Jetbrains 的 IDE 是怎么做的呢?我觉得挺好,
Lighfer
2018-06-04 21:18:18 +08:00
@ahhui 对的,这个是我的错误。主要的问题都不在于 licence 里面是什么,licence 怎么生成的,真正的问题在于只要是(在我的理解范围内的只要是)纯 java 实现的,都可以比较轻易的通过反编译得到对应的验证逻辑,然后替换 class 文件实现破解,正如 25 楼说的这样= =
Lighfer
2018-06-04 21:19:38 +08:00
@pabupa JB 是网上有现成的 licence 可以用,所以别人就不需要去做破解版了,还有就是 JB 的授权服务器也被破解了,可以自己搭建的
anotherlf
2018-06-04 21:21:15 +08:00
直接开源,然后卖原厂服务,做产品的时候积极挖坑就好。
PHPer233
2018-06-04 21:23:34 +08:00
你只需要对授权验证的相关代码进行加密或混淆,不需要对普通代码做特殊手段。我之前遇到过一款软件,对加解密算法进行保护,我们搞了几天没搞出来。不知道是用了什么保护手段。
Lighfer
2018-06-04 21:24:17 +08:00
@anotherlf 哈哈哈产品是涉密的,不能开源、不能接 U 盘,包括日志文件都必须经过审核才能拿出来的
Lighfer
2018-06-04 21:26:58 +08:00
@PHPer233 目前正在考虑类似的方案,可能目前比较好的方法就是混淆+自主加密算法+10 楼的方案吧
wenzhoou
2018-06-04 21:27:15 +08:00
你的程序相当于客户端,你公司的版权服务器相当于服务器端。 这个问题就是客户端和服务器端双方互相确认对方的身份问题。 具体来说,根据每个客户第一次运行的机器,生成一个加密文件。你把这个加密文件的拿来,用自己的私钥签名。作为卖给每个客户的 license,邮件方式给用户。软件每次启动,或者执行一些关键函数的时候都确认这个文件存在性,以及没有被篡改,以及本机的信息都匹配才可以执行。 那软件的完整性怎么确保。还是一样把关键文件的 hash 值做校验。
qile1
2018-06-04 21:32:22 +08:00
自己看看公开加密算法或者自己写个加密算法,生成 12 位或者多少位注册码让用户注册,软件牛到需要请人破解,只能埋雷了,
话说我以前弄注册码直接有个字段放时间字符,每次过期注册码只改那个字符,后来他们自己会改了,就再没有给我付尾款,两年了!
lihongming
2018-06-04 21:37:51 +08:00
软件防破解的关键在于设置多个加密点,且触发方式不同,比如执行某项操作时,顺便对授权管理文件的哈希值做个校验,看有没有改动过。
尤其是延时触发一定要做。当你检测到破解、调试等行为时,先不要做出保护动作,让软件正常运行,这样他就很难一次性把所有加密点全都找到。
后续怎么处理就看心情了,比如半年以后把他的数据加密一下。但要注意好法律问题,千万不要搞成勒索,数据恢复是免费的,但你可以在软件授权协议中约定,如果有调试、破解、反编译等行为,需要支付违约金多少多少钱……
Lighfer
2018-06-04 21:38:59 +08:00
@wenzhoou 那么假设确认这个文件存在性、是否被篡改及机器信息匹配的函数(或者多个函数)被反编译后,对方根据反编译得到的代码编译出一个总是返回验证通过的版本的 class 替换掉了原来的 class 文件,这种情况也还是无法解决了,毕竟 java 的字节码和源码差不了太多。。
Lighfer
2018-06-04 21:43:35 +08:00
@lihongming 这个方案也好,而且可以较好地结合其他楼主的方案,受教了,十分感谢!
wly19960911
2018-06-04 22:04:08 +08:00
/t/329592

可以参考一下思路。
lastpass
2018-06-05 00:15:15 +08:00
涉密产品呀,不用搞这么麻烦。你直接把数据库的初始化 sql 给加密就好,只有使用你专门的加密方式才能解密。你完全可以方向,绝对不会有人敢去,或者想去破解你的数据库。使用涉密数据库用户会把它看的比他家还严实 100 倍。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/460322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX