Java 离线授权方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Lighfer
V2EX    Java

Java 离线授权方案

  •  
  •   Lighfer 2018-06-04 18:58:37 +08:00 11133 次点击
    这是一个创建于 2701 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    55 条回复    2018-06-06 07:48:39 +08:00
    Lighfer
        1
    Lighfer  
    OP
       2018-06-04 18:59:17 +08:00
    手机发表的,换行都没了,我一会回去调整一下
    Lighfer
        2
    Lighfer  
    OP
       2018-06-04 19:00:58 +08:00
    好像不能编辑… 各位看官辛苦了……
    shayuvpn0001
        3
    shayuvpn0001  
       2018-06-04 19:01:30 +08:00
    加密狗 + 限时的 Licence
    chinvo
        4
    chinvo  
       2018-06-04 19:03:17 +08:00 via iPhone
    Java bytecode 和明文源码没多大区别,所以用硬件,把一部分核心逻辑放到加密狗里面。
    olOwOlo
        5
    olOwOlo  
       2018-06-04 19:04:12 +08:00
    。。。我还是第一次听说把公钥保密,私钥公开的
    chinvo
        6
    chinvo  
       2018-06-04 19:05:44 +08:00 via iPhone
    @olOwOlo #5 你一说我才发现楼主是保密公钥
    Lighfer
        7
    Lighfer  
    OP
       2018-06-04 19:05:53 +08:00 via iPhone
    @shayuvpn0001 客户的机子上是禁止 usb 的,所以加密狗用不了,licence 限时意义不大,因为被反编译后授权完整的代码基本都呈现出来了,很容易造出一个破解版的 class 文件把验证算法跳过去……
    Lighfer
        8
    Lighfer  
    OP
       2018-06-04 19:06:17 +08:00 via iPhone
    @chinvo 不用用加密狗,usb 禁用的……
    Lighfer
        9
    Lighfer  
    OP
       2018-06-04 19:07:26 +08:00 via iPhone
    @olOwOlo rsa 加密一般不都是用公钥加密私钥解密吗,而且只要保证其中任意一个不泄露,其实用哪个公开都可以的吧?
    gam2046
        10
    gam2046  
       2018-06-04 19:07:49 +08:00   1
    看应用被破解的强度吧。一般的,用自定义 ClassLoader 去加载 bytecode,同时 ClassLoader 用 native 写,基本上可以防止很多中低端的破解手段。

    要高强度的就是考虑上面大佬说的看门狗方案,将部分功能以及授权验证抽离到独立外部硬件中进行。
    chinvo
        11
    chinvo  
       2018-06-04 19:08:45 +08:00 via iPhone
    @Lighfer
    #8 用 PCI 的狗咯

    #9 你可理解错了,公钥可以直接用私钥计算出来
    Lighfer
        12
    Lighfer  
    OP
       2018-06-04 19:10:06 +08:00 via iPhone
    @gam2046 客户的机子禁用 usb,所以似乎加密狗的方案行不通…… classloader 倒是一个更好的思路,我回头研究一下,十分感谢!
    Lighfer
        13
    Lighfer  
    OP
       2018-06-04 19:11:50 +08:00 via iPhone
    @chinvo !!原来是这样…怪我调研不足,十分感谢提醒!
    Lighfer
        14
    Lighfer  
    OP
       2018-06-04 19:12:15 +08:00 via iPhone
    @olOwOlo 有人给出解释了,私钥可以推出公钥,十分感谢指出问题!
    zhjits
        15
    zhjits  
       2018-06-04 19:26:43 +08:00
    如果客户终端比较多的话写一个 license server,server 要求定期从公司网站下一个 license file 喂进去(
    wenzhoou
        16
    wenzhoou  
       2018-06-04 19:58:41 +08:00 via Android
    公钥保存在公司内。说的是谁的公司内,你的公司内 还是使用者公司内?
    jadec0der
        17
    jadec0der  
       2018-06-04 20:19:27 +08:00   1
    @chinvo
    @Lighfer RSA 的话,私钥不能计算公钥。只是有的实现会把公钥也放进私钥文件里
    Lighfer
        18
    Lighfer  
    OP
       2018-06-04 20:23:46 +08:00
    @zhjits 这样问题就变成了破解 licence server 了。。
    Lighfer
        19
    Lighfer  
    OP
       2018-06-04 20:24:27 +08:00
    @wenzhoou 我们公司内,我们公司用公钥计算出授权文件,再卖给客户
    Lighfer
        20
    Lighfer  
    OP
       2018-06-04 20:25:28 +08:00
    @jadec0der 一会吃完饭我去仔细研究一下,十分感谢,受教了!
    likuku
        21
    likuku  
       2018-06-04 20:27:18 +08:00
    唯有在线激活(激活服务器记录保存验证客户购买和机器信息,确保任何时候客户激活的机器总数不超过许可)这种机制可以在技术上较好得应对这个状况。
    cxh116
        22
    cxh116  
       2018-06-04 20:34:06 +08:00 via Android   1
    用硬件加密狗都能破解,只是比普通的纯软件加密难度高些。

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

    if (validate(license))

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

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

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

    重要的事情说三遍。

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

    可以参考一下思路。
    lastpass
        40
    lastpass  
       2018-06-05 00:15:15 +08:00 via Android
    涉密产品呀,不用搞这么麻烦。你直接把数据库的初始化 sql 给加密就好,只有使用你专门的加密方式才能解密。你完全可以方向,绝对不会有人敢去,或者想去破解你的数据库。使用涉密数据库用户会把它看的比他家还严实 100 倍。
    IvanLi127
        41
    IvanLi127  
       2018-06-05 00:44:25 +08:00 via Android
    检测盗版,是盗版就干病毒干的活,然后要钱。干得隐秘点,让人以为都是破解的时候出差错了。
    ETiV
        42
    ETiV  
       2018-06-05 00:58:25 +08:00
    不过话说回来,你服务的客户,真有这样的技术么 -。-
    去破解你家的软件,再拿出去卖吗…

    我有个大学同学,毕业后留校了,管图书馆
    去年聊天得知,图书馆内部的那个什么系统,也是买的第三方的,授权之类的一律离线

    然后卖他们系统的就有售后服务的小伙,全国各地的跑,去更新这个系统、备份里面的数据,相当于运维。
    qwertyegg
        43
    qwertyegg  
       2018-06-05 01:00:44 +08:00
    @jadec0der 有了私钥虽然不能解析算出来公钥,但是要攻击并不难,因为缺的那个 e 并不大(1 < e < λ(n) ),而且常常选的就是 65537
    miketeam
        44
    miketeam  
       2018-06-05 01:39:43 +08:00 via iPhone
    楼主的老板思维好僵化,看看人家微软怎么做!你不会盗版?没关系,我注册小号教你破解系统!要的是市场。
    Lighfer
        45
    Lighfer  
    OP
       2018-06-05 07:46:25 +08:00 via iPhone
    @lastpass 哈哈哈哈是这样的没错,所以我们这个不带数据库的哈,除了日志文件,其他的不能记录任何客户的信息,导出日志都需要审核,我们的产品是工具类的
    Lighfer
        46
    Lighfer  
    OP
       2018-06-05 07:46:52 +08:00 via iPhone
    @IvanLi127 然后就等着坐牢了…
    scmod
        47
    scmod  
       2018-06-05 09:22:41 +08:00
    只有混淆了感觉,或者 Excelsior JET 之类的?
    flower545
        48
    flower545  
       2018-06-05 11:41:30 +08:00 via Android
    @qile1 好奇是什么软件
    oska874
        49
    oska874  
       2018-06-05 12:29:31 +08:00
    加密狗一条路。
    Greatshu
        50
    Greatshu  
       2018-06-05 13:32:11 +08:00
    涉密软件不会有人搞盗版的,破解版谁敢用
    qile1
        51
    qile1  
       2018-06-05 13:44:29 +08:00 via Android
    @flower545 是自助发药机的接口,从 his 系统整理药品数据,同步到发药机的火鸟数据库,用的 his 系统是微软 mssql,用户名 sa 别系统也在使用,数据库封 ip 后有的程序报错,连接不上,现在用跟踪器发现我程序名没有重复的,不知道怎么封!
    IvanLi127
        52
    IvanLi127  
       2018-06-05 15:03:16 +08:00 via Android
    @Lighfer 所以说隐秘点嘛 哈哈
    enenaaa
        53
    enenaaa  
       2018-06-05 17:19:11 +08:00
    @qwertyegg 现在公钥很少这么简单的了。 一般是和私钥同样的位数。
    wmhx
        54
    wmhx  
       2018-06-06 01:51:24 +08:00
    v2ex 里面有个卖水厂软件的,说到类似的版权保护方案, 大概意思是说纯靠技术基本是不现实的, 需要一个很好好的合约,里面做好约定, 然后才是考验你的技术了, 类似#36 楼那样, 设置多个检查点, 定期检查, 如果发现问题就加密或混淆部分数据, 这就是破解或者没有售后的结果, 等其发现数据不对自然回来找你的, 然后你再用约定来约束之, 让买授权解决数据恢复问题. 这也是一个 javaer 能想到的最好的方案了 .
    Lighfer
        55
    Lighfer  
    OP
       2018-06-06 07:48:39 +08:00 via iPhone
    @wmhx 确实是,盗版这么流行不是没原因的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3616 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 10:38 PVG 18:38 LAX 03:38 JFK 06:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86