• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jack778
V2EX  ›  程序员

单独部署在客户服务器上的 Java 应用如何防止客户将其再次部署到其他客户的服务器?

  •  
  •   jack778 · May 7, 2021 · 4143 views
    This topic created in 1862 days ago, the information mentioned may be changed or developed.
    如题,我用 java 做了一个管理系统出售给某个客户并需要部署到客户的服务器,客户方面有懂技术的人员,如何防止他们去将这个应用再次部署到其他服务器上,或者说尽量增加他们移植到其他服务器的成本?以防止他们将其二次出售给其他客户, 从而影响本人的利益.请各位大佬分享一些经验,谢谢.
    Supplement 1  ·  May 8, 2021
    我现在想到的最简单的方法就是用 RSA 算法的私钥来加密客户服务器上的 MAC 地址,加密后的字符串作为密匙,应用启动后用公钥来解密出加密过的 MAC 地址和本机的 MAC 地址做对比,如果符合就通过,但是这个办法有个致命的缺陷就是可以通过反编译修改字节码跳过。其他如联网验证等方法好像也无法躲过这个缺陷。除非把字节码也给加密了,这个就有点复杂了。
    31 replies    2021-05-08 13:59:30 +08:00
    PolarBears
        1
    PolarBears  
       May 7, 2021
    硬件 key
    nvkou
        2
    nvkou  
       May 7, 2021 via Android
    写好协议。收集并固定证据就是
    这东西你做进去也只是防君子不防小人
    参考 intelJ
    lsp7572
        3
    lsp7572  
       May 7, 2021
    这种不就是 license 吗,和 java 不 java 完全没关系吧
    manami
        4
    manami  
       May 7, 2021
    签协议,有法律法规约束
    ch2
        5
    ch2  
       May 7, 2021   ❤️ 1
    定时往你的服务器发心跳包,如果出现了不止一个 ip 发过来的包,就去警告他们
    66450146
        6
    66450146  
       May 7, 2021
    数据保存到你自己的服务器上,收他们数据存储和读写的费用(
    statement
        7
    statement  
       May 7, 2021 via iPhone
    证书 绑定硬件
    jones2000
        8
    jones2000  
       May 7, 2021   ❤️ 1
    通过 mac 地址生成授权码。
    young1lin
        9
    young1lin  
       May 7, 2021 via Android
    我记得可以加 License 这种的,定期更换 License,过期后项目启动不了。我第一家公司就是这么做的,比较麻烦。卖大数据平台的,也是这么做的。
    xuanbg
        10
    xuanbg  
       May 7, 2021
    1 、usb 加密狗。
    2 、根据用户的机器上的 CPU 序列号什么的生成一个唯一 Key,然后需要使用这个 Key 来获取关键的启动配置信息。私自部署的 Key 你这里没有对应的 value,就无法启动。
    Greatshu
        11
    Greatshu  
       May 8, 2021
    检测到被破解,就触发 bug,数据到达一定量时,程序闪退且无法启动,再次启动提示联系客服。为了保证数据库安全,每个客户单独生成一个密钥,触发 bug 后加密数据库。这样也方便追踪盗版来源。
    geekvcn
        12
    geekvcn  
       May 8, 2021 via iPhone
    硬盘 uuid 不过怕虚拟机,物理机好用
    wangxiaoaer
        13
    wangxiaoaer  
       May 8, 2021
    如果是基于 docker 部署的,上面的大多数什么授权码都不行吧,加密狗支不支持也难说,另外现在都是云平台部署,你加密狗插哪里?那些说发心跳包的,客户如果是本地私有云环境,压根就不连外网,发不过来的。
    MakeItGreat
        14
    MakeItGreat  
       May 8, 2021 via Android
    让你的程序运行如果不是你部署的环境,会有一个小概率删掉点什么,同时把删掉的这些写入到自己能看的地方
    写好联系方式,等他们找你
    EIJAM
        15
    EIJAM  
       May 8, 2021 via iPhone
    签合同
    MrUser
        16
    MrUser  
       May 8, 2021
    可以考虑关联域名,域名只能解析到一个 IP 。
    bthulu
        17
    bthulu  
       May 8, 2021
    @xuanbg 这个客户可以改字节码的, 直接跳过去就行了
    wangsd
        18
    wangsd  
       May 8, 2021
    之前公司的做法是获取电脑硬盘的一个硬件 ID 生成一串序列码,客户需要将序列码给我们然后计算出注册号给他们。
    xuanbg
        19
    xuanbg  
       May 8, 2021
    @bthulu 改字节码跳过去好啊。。。

    根据《中华人民共和国刑法》第二百八十六条规定,破坏计算机信息系统罪是指违反国家规定,对计算机信息系统功能或计算机信息系统中存储、处理或者传输的数据和应用程序进行破坏,或者故意制作、传播计算机病毒等破坏性程序,影响计算机系统正常运行,后果严重的行为。

    入刑哦!
    hnbcinfo
        20
    hnbcinfo  
       May 8, 2021
    加密狗
    yitingbai
        21
    yitingbai  
       May 8, 2021
    @wangsd java 写的程序这么做没意义, 加密方法轻易就被看到了
    KagurazakaNyaa
        22
    KagurazakaNyaa  
       May 8, 2021
    把一部分关键逻辑放在你的服务器上,然后做 api 鉴权
    wanguorui123
        23
    wanguorui123  
       May 8, 2021 via iPhone
    绑定硬件,每次只允许生成一份软件授权码
    buster
        24
    buster  
       May 8, 2021
    曾经破解过一个 BI 软件,直接修改底层依赖包里的 LICENSE 验证代码,写死过期时间就可以实现无限期使用了。

    可以优先考虑如何防止(混淆)反编译,然后再把你的 license 验证代码藏进去。
    timethinker
        25
    timethinker  
       May 8, 2021   ❤️ 1
    要真防的话是防止不了的,就如 2 楼所言,防君子不防小人,收集证据是一种方法,但是如果他们的服务器不联网或者屏蔽了你们的中央服务器,这一招就没有办法了。

    以往的做法就是,软件根据所部署系统的一些特征生成一个唯一标识( UID ),软件厂商根据一些算法,例如使用私匙对这个唯一标识进行签名生成一个授权码。客户获取授权码之后进行配置,然后软件启动的时候获取 UID,并根据授权码和公匙进行校验。

    需要指出的是以上方法如果系统环境被复制(在系统层面没有什么是不能模拟的),或者软件内置的公匙被替换为他们自己的,都会导致此方法失效。

    估计未来一段时间仍然会有这种独立部署的需求存在,除非客户端是断网的,内部使用的(例如学校内的一些系统),否则现在绝大多数服务基本上都转变为 SaaS 模式了,多租户使用一组服务器,数据上进行隔离分区,不仅方便版本升级,也省去了客户部署的操作。
    jack778
        26
    jack778  
    OP
       May 8, 2021
    @Greatshu 老哥的办法有点狠
    matrix67
        27
    matrix67  
       May 8, 2021
    这不就是单机软件防破解么

    于破解过招,保护你的共享软件
    ――此文曾作为连载刊登于《电脑报》 2003 年 41 、42 期,如要转载,请注明出自《电脑报》

    推荐搜索看一下这篇文章,看雪论坛 03 年左右就有讨论过的。
    jack778
        28
    jack778  
    OP
       May 8, 2021
    @qwe520liao 私有部署是客户对数据安全有心理障碍,反正就是单独部署在自己服务器才感觉安心,这是心理需求,并非真正的安全需求。
    saytesnake
        29
    saytesnake  
       May 8, 2021
    可以上外网,在线授权 orgid,无法上外网,就加密狗。
    zm8m93Q1e5otOC69
        30
    zm8m93Q1e5otOC69  
       May 8, 2021
    加一层 mac 地址验证?
    cheng6563
        31
    cheng6563  
       May 8, 2021
    找一个 c 的加解密库,预编译成 dll/so 用 jni 调用。
    给所有 jar 文件加密,自定义个类加载器,即时解密 jar 文件并加载。
    通过 mac 地址生成授权码。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2756 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 128ms · UTC 13:06 · PVG 21:06 · LAX 06:06 · JFK 09:06
    ♥ Do have faith in what you're doing.