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

Java 离线授权方案

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

    公司开发了一个新产品,客户是在内网环境下使用的,但是我们的产品又需要卖授权,有没有人做过类似的方案呢? 目前考虑的方案是:使用非对称加密算法生成公钥和私钥,公钥保存在公司内,用于生成 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   ·   实用小工具   ·   5513 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:48 · PVG 16:48 · LAX 00:48 · JFK 03:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.