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

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

  •  2
     
  •   balabalaguguji · 47 天前 · 5296 次点击
    这是一个创建于 47 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    当然,如果死心塌地的走逆向破解,怎么防都没用。
    libook
        19
    libook   47 天前
    基本思路是把脚本源代码转换成字节码,再增加一些反逆向的措施就行了。

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

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

    Python 不了解,但应该也有类似思路的方案。
    janxin
        20
    janxin   47 天前
    PHP 可以 Zend 混淆

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

    Python 可以分发中间码文件
    est
        21
    est   47 天前   ❤️ 4
    python 的话,简单。你跑起来后把本地工程目录文件全删了就行

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

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

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

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

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