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

私有部署如何避免代码泄露?如何限制服务有效期?

  •  2
     
  •   balabalaguguji · 2021-10-13 09:51:44 +08:00 · 8401 次点击
    这是一个创建于 898 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需要给客户部署 web 服务到他们服务器,想给他一个注册码,填入后就可以获得一年有效期,到期后无法使用,就类似 jetbrains 的付费方式。

    但是服务端代码如果是 js/python 这类脚本语言,代码都是明文的,不好做有效期的逻辑,别人直接改掉就没了,有什么办法做到呢?

    第 1 条附言  ·  2021-10-13 11:00:48 +08:00
    感觉脚本语言很难做到,Go 可以编译为二进制,简简单单就做到了。
    69 条回复    2021-10-15 01:27:12 +08:00
    JDog
        1
    JDog  
       2021-10-13 09:54:38 +08:00
    套个虚拟机🐶
    emeab
        2
    emeab  
       2021-10-13 09:59:25 +08:00
    如果是 python 可以用 Cython .
    如果是 js 只能做混淆了.
    whcoding
        3
    whcoding  
       2021-10-13 10:04:02 +08:00
    这没办法吧 都部署到人家的服务器了, 等个大佬~
    wolfie
        4
    wolfie  
       2021-10-13 10:04:42 +08:00
    写进第三方库依赖里。并且写死。每次续费 重新维护。
    masterclock
        5
    masterclock  
       2021-10-13 10:08:08 +08:00
    不给这些文件的读写权限?
    NewYear
        6
    NewYear  
       2021-10-13 10:13:16 +08:00
    现在都是不在客户端做严格的防护了,而是把部分功能对接你的云端服务器,通过控制服务的可用性来操控客户端的客户端。。。

    客户端太难防备了。
    ch2
        7
    ch2  
       2021-10-13 10:14:46 +08:00
    你收费高了的话,他总能花钱雇到逆向你加密的人才
    initdada
        8
    initdada  
       2021-10-13 10:21:37 +08:00
    授权中心系统,TCP 心跳机制
    rationa1cuzz
        9
    rationa1cuzz  
       2021-10-13 10:21:48 +08:00
    源码加密的话,python 的话可以转成.so 文件,成本相对低一点,另外有效期可以手写个简单的 license,连外网校验,有限制的话让开个白名单就好。
    paopjian
        10
    paopjian  
       2021-10-13 10:25:43 +08:00
    antd 敢在代码里埋时间炸弹,明文的玩意都没几个人发现,自己偷偷埋检测呗
    balabalaguguji
        11
    balabalaguguji  
    OP
       2021-10-13 10:26:12 +08:00
    @initdada #8 别人直接改下代码就好了,而且有些是只内网
    efaun
        12
    efaun  
       2021-10-13 10:38:59 +08:00
    usb-key
    eason1874
        13
    eason1874  
       2021-10-13 10:40:33 +08:00
    大软件好搞,用 Client/Server 模式,在本地开个虚拟机跑 Server,主程序和验证程序在里面,用系统账号密码保护,通过接口向 Client 提供服务

    小软件就比较难搞,不过混淆加密编译二进制什么的也能打消大部分的破解想法了
    keepeye
        14
    keepeye  
       2021-10-13 10:48:11 +08:00
    考虑云端校验,就是要求外网权限了
    2i2Re2PLMaDnghL
        15
    2i2Re2PLMaDnghL  
       2021-10-13 10:54:42 +08:00
    @paopjian 这里的问题不是未发生时能不能发现,而是发生后能不能去除。
    victorywangzhcn
        16
    victorywangzhcn  
       2021-10-13 10:59:48 +08:00
    白盒密码搞起
    balabalaguguji
        17
    balabalaguguji  
    OP
       2021-10-13 11:01:45 +08:00
    @efaun #12 你代码都明文的,别人改下就不读取你 usb-key 了
    kop1989
        18
    kop1989  
       2021-10-13 11:04:45 +08:00
    这种私有云情况,如果有条件,走云校验。

    如果没有条件,则每次续费下发加密的库文件。库文件最好夹杂业务,越复杂越好。

    当然,如果死心塌地的走逆向破解,怎么防都没用。
    libook
        19
    libook  
       2021-10-13 11:06:10 +08:00
    基本思路是把脚本源代码转换成字节码,再增加一些反逆向的措施就行了。

    对于 JS,如果使用 V8 引擎的话,V8 会把 JS 转换成优化过的字节码再运行,那么你可以考虑把这个字节码从 V8 里导出出来,可以去 Google 上搜一下“export bytecode from v8”相关的信息,有手动导出的教程,也有一些现成的工具。

    另外也可以考虑转换成 WebAssembly,也就相当于转换成字节码了,只不过不止针对 V8,兼容任何支持 WebAssembly 的引擎。

    Python 不了解,但应该也有类似思路的方案。
    janxin
        20
    janxin  
       2021-10-13 11:12:15 +08:00
    PHP 可以 Zend 混淆

    JS 可以使用 qjsc,上面提到的 webassembly 也是一个方案

    Python 可以分发中间码文件
    est
        21
    est  
       2021-10-13 11:13:12 +08:00   ❤️ 4
    python 的话,简单。你跑起来后把本地工程目录文件全删了就行

    (当然你不能搞什么动态 import 了。
    xgfan
        22
    xgfan  
       2021-10-13 11:14:59 +08:00
    intellij 的到期之后,还是可以用的,只是不能升级了。
    kekxv
        23
    kekxv  
       2021-10-13 11:18:16 +08:00 via iPhone
    不加密,发现了就警告并准备发生律师函,这不简单多了
    efaun
        24
    efaun  
       2021-10-13 11:18:29 +08:00
    @balabalaguguji #11 我说的是硬件,插在 usb 接口上的,初始化系统就必须一直插着,有任何断联行为就必须回单位激活,海关就用的这
    zjsxwc
        25
    zjsxwc  
       2021-10-13 11:22:38 +08:00
    业务代码混淆就行,目的仅仅只是增加修改和添加新业务的难度,而不是防破解,
    真要破解的话,防不住的,
    君不见市面上那么多商业软件都会有对应的破解注册机出来,这些商业软件可都是编译成二进制的。
    Ansen
        26
    Ansen  
       2021-10-13 11:22:54 +08:00
    @est #21 这操作可太骚了
    Aprilming
        27
    Aprilming  
       2021-10-13 11:25:41 +08:00
    我们是做 license , 前提是客户的服务器,但是服务器密码,grub 密码,就我们自己清楚。
    zjsxwc
        28
    zjsxwc  
       2021-10-13 11:29:33 +08:00
    而且有 libfaketime ( https://github.com/wolfcw/libfaketime ) 这肆意修改进程时间的库存在,
    有效期保护只能防君子,

    比如 `faketime '2018-12-24 08:15:42' /idea.sh` 无限白嫖 idea
    cheng6563
        29
    cheng6563  
       2021-10-13 11:32:26 +08:00
    用 c,go,rust 之类的语言写几个关键并通用的逻辑做成.so/.dll ,比如登录密码校验,数据序列化时的加密解密。然后业务代码再混淆一下。
    ersic
        30
    ersic  
       2021-10-13 11:32:30 +08:00
    有合同的话不怕吧,到期他继续用就起诉呗。
    pkoukk
        31
    pkoukk  
       2021-10-13 11:51:58 +08:00
    pyhon 和 nodejs 都可以调用 c 库的
    把一些核心操作和权限一起封进 c 里调用,比如数据的序列化 /反序列化。
    pkoukk
        32
    pkoukk  
       2021-10-13 11:53:52 +08:00
    不需要太高的破解难度,只需要让他们破解的成本增加就行了
    makelove
        33
    makelove  
       2021-10-13 12:00:38 +08:00
    @pkoukk 什么调用 C 库,调用在线验证,只要把调用代码空掉就没用了,C 库里写出花也是白干
    dangyuluo
        34
    dangyuluo  
       2021-10-13 12:03:03 +08:00
    二进制层面都是明文啦
    cookgo
        35
    cookgo  
       2021-10-13 12:15:30 +08:00
    用 C/C++/Rust/Golang 写一个二进制程序,授权到期了,直接杀掉 Js/Python 服务的进程。
    vinsony
        36
    vinsony  
       2021-10-13 12:47:36 +08:00
    我之前用 js 写服务端,也是用 webpack 打包成一个文件了的,体积小还方便部署,代码经过 webpack 之后也变得比较难读。
    当然这还不够,还要防止 js 文件里的关键判断被轻易找到。比如你限制使用日期,就不要直接写年月日进去,可以写成 if (time > 17e11)这种。然后过期了你也不要输出提示信息,防止被搜索到,直接让程序挂掉或者数据错乱就好了。
    js 可以有很多骚操作,比如你可以在任何地方污染一下原型,写法也多种多样,比如 Object.defineProperty(Array.prototype, 'fil' + 'ter', {}),这样用到 filter 的地方就会 GG 了,只要你把污染的方法名字变化一下,他搜对应的接口或者关键字,毛都搜不到~
    xiangyuecn
        37
    xiangyuecn  
       2021-10-13 12:53:19 +08:00
    extend #21 你跑起来后把本地工程目录文件全删了就行 {
    1. 源码打个加密压缩包
    2. 启动时校验授权,解压缩到其他很难找到的目录,启动代码直接明文,但写的鬼都不认识
    3. 正常运行

    - 源码内也加授权校验代码,也写的鬼都不认识
    }

    就问骚不骚😂😂😂
    xuanbg
        38
    xuanbg  
       2021-10-13 13:01:25 +08:00
    核心逻辑放在自己服务器上面提供远程调用。当然这个逻辑不能是高频的那种。
    est
        39
    est  
       2021-10-13 13:34:34 +08:00
    @xiangyuecn 既然你都启动时校验授权了,那么 python 可以直接从远端 zip 进行 import 。源代码根本都不用落盘。
    pkoukk
        40
    pkoukk  
       2021-10-13 13:45:38 +08:00
    @makelove
    nodejs 里的 buffer 就是 c 实现的,请你把 buffer 这块代码空掉再试试,你看还跑得起来不
    xuxuxu123
        41
    xuxuxu123  
       2021-10-13 13:46:50 +08:00
    js 的话,有个想法:
    把某个核心逻辑,通过引用云端的 js 方式进行处理,然后那个云端文件在你自己服务器,自己做授权;剩下的就开混淆
    zhangchongjie
        42
    zhangchongjie  
       2021-10-13 13:57:08 +08:00
    代码混淆,核心代码 http 协议请求运行,核心代码一定不能放在本地,如果是内网部署,那可能就没有办法了。或者是 jar 包 sdk 集成。反正就这些东西
    lucays
        43
    lucays  
       2021-10-13 14:17:57 +08:00
    二进制了也是可以逆向出来的
    没有绝对安全的方法,就是成本问题,那么多商业软件也都有破解版
    winiex
        44
    winiex  
       2021-10-13 14:26:48 +08:00
    nodejs 用 nexe,python 用 pyinstaller 。
    但要做到万无一失,还要考虑绑定 mac 、CPU ID 等硬件信息。
    balabalaguguji
        45
    balabalaguguji  
    OP
       2021-10-13 15:42:39 +08:00
    @cookgo #35 直接把你的 Go 程序杀掉就好啦
    balabalaguguji
        46
    balabalaguguji  
    OP
       2021-10-13 15:43:10 +08:00
    @kekxv #23 别人内网用,你都不知道他们有没在用
    balabalaguguji
        47
    balabalaguguji  
    OP
       2021-10-13 15:44:20 +08:00
    @lucays #43 不讲究那么高端的破解,能增加破解难度就好了。
    balabalaguguji
        48
    balabalaguguji  
    OP
       2021-10-13 15:58:21 +08:00
    @winiex #44 感谢!试了下,pyinstaller 可以的,我之前有用过这个,印象中有稍微复杂点的依赖都是转不出来 exe 的,所以都没考虑过,没想到现在是可以的。
    SmallXeon
        49
    SmallXeon  
       2021-10-13 17:14:50 +08:00
    python 的话可以用 pyarmor 加密代码
    Rheinmetal
        50
    Rheinmetal  
       2021-10-13 17:15:47 +08:00
    纯内网的话 在线验证不好搞了
    那就在业务设计和代码上做文章
    实现用一段时间(一个月左右)就需要你去维护
    具体逻辑不能太明显太简单 否则容易破解
    一段时间内免费维护 之后按时长收费
    SmallXeon
        51
    SmallXeon  
       2021-10-13 17:16:09 +08:00
    js 也有 UglifyJS 这种可以加密混淆,也是可以阻止他人查看代码逻辑的
    s127
        52
    s127  
       2021-10-13 17:37:57 +08:00
    都是防君子不防小人,加个代码混淆就可以了。就当放水养鱼,抓大的就行了。
    fannas
        53
    fannas  
       2021-10-13 17:45:42 +08:00 via iPhone
    1. 网络校验授权
    2. 部分功能 rpc
    3. 律师函准备
    MCyunpeng98
        54
    MCyunpeng98  
       2021-10-13 17:55:16 +08:00
    @masterclock #5 自己的服务器,文件权限不是随便改?
    Mithril
        55
    Mithril  
       2021-10-13 17:59:52 +08:00
    软件保护从来都只是个成本问题而不是技术问题。
    最简单的,合同只签一年,一年以后不付钱直接起诉就行了。
    podel
        56
    podel  
       2021-10-13 18:03:09 +08:00
    python 有好多中打包的软件。
    js 可以编译混淆。
    另外申请软件著作权。对面破解了,找证据告他们就是了。
    youlooksocool
        57
    youlooksocool  
       2021-10-13 18:38:18 +08:00   ❤️ 1
    刚刚最近在思考这个问题:

    1 、代码中
    采用混淆代码,降低源码可读性。
    ( 1 )用到代码混淆库,如 pyobfuscate 。
    ( 2 )修改 Python 解释器,利用抽象语法树 AST 混淆源码。


    2 、打包时候
    ( 0 )发行 .pyc 二进制文件,虽然无法直接看出源码,但一些工具能够直接反编译出源码。
    ( 1 ) Pyinstaller 是打包为二进制可执行文件 exe/elf/app 。
    ( 2 ) Nuitka 打包为二进制可执行文件。打包后的 exe 比 Pyinstaller 打包后的 exe 运行速度提升 30%。因为底层转换为了 C 程序再编译为二进制文件。目前,反编译 C 程序难度和成本比较大。
    ( 3 ) cython 编译为 C 文件,然后再将 C 文件编译为操作系统的动态链接库文件。(Linux 下的 .so 文件和 Windows 下的 .pyd 文件)。但兼容性不是很好。


    3 、付费加密,风险外包
    ( 1 ) Pyarmor 付费,使用脚本加密。
    ( 4 ) Sourcedefender 付费,使用 AES-256 加密。


    4 、寻求法律保护
    ( 1 )许可证 /合同 /条款和条件。
    ( 2 )申请专利。
    changwei
        58
    changwei  
       2021-10-13 19:18:57 +08:00
    用 usb 加密狗就好了,之前去过某学校数据中心,几乎每台服务器上面都插着加密狗,都是买了 xx 教务软件 xx 管理系统之类的然后厂商用这种办法做限制。
    nanjingwuyanzu
        59
    nanjingwuyanzu  
       2021-10-13 19:30:54 +08:00
    有没有针对 java 代码的保护?
    cszchen
        60
    cszchen  
       2021-10-13 19:36:24 +08:00 via iPhone
    最简单的做法是:
    linux 部署好了之后,设置目录权限,有权限的用户和 root 账号不要给他们,到期手动停
    nightwitch
        61
    nightwitch  
       2021-10-13 20:06:19 +08:00
    核心代码走 C 库调用,C 库里面做验证。
    stevenhawking
        62
    stevenhawking  
       2021-10-14 02:07:36 +08:00
    核心逻辑存在云端
    akira
        63
    akira  
       2021-10-14 02:15:18 +08:00
    所以你发现没有,现在有些产品价格超低甚至免费,然后部署、售后、技术支持这些地方来赚你的钱
    DeWjjj
        64
    DeWjjj  
       2021-10-14 02:32:17 +08:00
    上次忘记在哪看到过一个打包 django 的。
    ihipop
        65
    ihipop  
       2021-10-14 08:14:30 +08:00 via Android
    @Aprilming 磁盘不加密的话外部挂载一下就能读取了
    Alliot
        66
    Alliot  
       2021-10-14 09:23:55 +08:00
    @cszchen 服务器都在人家手里,直接改个密码很简单的。实在不行 把硬盘挂出来也没啥问题。
    cszchen
        67
    cszchen  
       2021-10-14 09:46:12 +08:00 via iPhone
    @Alliot 你多试试就知道了
    adoal
        68
    adoal  
       2021-10-14 12:32:18 +08:00
    不要做穷逼且爱折腾技术搞破解的客户的生意。这样的客户搞不清甲乙方的价值界限。
    cnscorpions
        69
    cnscorpions  
       2021-10-15 01:27:12 +08:00
    Node.js: Minify + Uglify + 编译成字节码 🤣
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2841 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 13:21 · PVG 21:21 · LAX 06:21 · JFK 09:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.