V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jack778
V2EX  ›  程序员

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

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

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

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

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

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

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

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

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

    推荐搜索看一下这篇文章,看雪论坛 03 年左右就有讨论过的。
    jack778
        28
    jack778  
    OP
       2021-05-08 09:38:20 +08:00
    @qwe520liao 私有部署是客户对数据安全有心理障碍,反正就是单独部署在自己服务器才感觉安心,这是心理需求,并非真正的安全需求。
    saytesnake
        29
    saytesnake  
       2021-05-08 09:43:00 +08:00
    可以上外网,在线授权 orgid,无法上外网,就加密狗。
    uselessVisitor
        30
    uselessVisitor  
       2021-05-08 13:56:21 +08:00
    加一层 mac 地址验证?
    cheng6563
        31
    cheng6563  
       2021-05-08 13:59:30 +08:00
    找一个 c 的加解密库,预编译成 dll/so 用 jni 调用。
    给所有 jar 文件加密,自定义个类加载器,即时解密 jar 文件并加载。
    通过 mac 地址生成授权码。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:38 · PVG 22:38 · LAX 06:38 · JFK 09:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.