V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
anviod
V2EX  ›  Go 编程语言

[问答]软件离线授权比较稳妥的方案

  •  
  •   anviod · 2022-08-31 11:12:43 +08:00 · 2732 次点击
    这是一个创建于 845 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前软件使用授权的方案如下

    • 获取当前系统信息
            System Information
            Manufacturer: Alibaba Cloud
            Product Name: Alibaba Cloud ECS
            Version: pc-i440fx-2.1
            Serial Number: 033430d9-4d07-4c5a-8a9f-7ef4ce4ee142
            UUID: 033430D9-4D07-4C5A-8A9F-7EF4CE4EE142
            Wake-up Type: Power Switch
            SKU Number: Unknown
            Family: Unknown
    

    虚拟机

            System Information
            Manufacturer: VMware, Inc.
            Product Name: VMware Virtual Platform
            Version: None
            Serial Number: VMware-56 4d a7 bf 49 4f 46 c6-d8 34 38 b1 df 82 2a 02
            UUID: BFA74D56-4F49-C646-D834-38B1DF822A02
            Wake-up Type: Power Switch
            SKU Number: Unknown
            Family: Unknown
    
    • 基于 SN 或者 UUID ,网卡 MAC 地址,授权开始时间,当前授权时间,授权结束时间等进行序列化

    • 最后基于序列化进行 RSA 私钥签名 类似于 JWT 方案,软件主体包含公钥验证下签名是否正常(软件记录每次运行时间,本次运行时间不得早于上次运行时间 同时也小于结束时间)

    • 签名验证完 反序列化获取授权主体信息 对比验证当前系统 SN 或者 UUID 网卡等是否匹配


    不知道还要什么需要补充的或者有更好的 Go 语言解决方案? 硬件安全狗?

    14 条回复    2022-09-06 09:58:45 +08:00
    root01
        1
    root01  
       2022-08-31 11:59:45 +08:00
    硬件坏了怎么办?需要换到其他电脑怎么办?
    anviod
        2
    anviod  
    OP
       2022-08-31 13:15:10 +08:00
    @root01 目前 ToB 的业务需求就有限制更换服务器,所有授权必须厂家人工授权, 所以不考虑更换服务器的事情.
    zjsxwc
        3
    zjsxwc  
       2022-08-31 13:15:55 +08:00
    可以通过反汇编跳过判断语句来破解
    sdcg1994
        4
    sdcg1994  
       2022-08-31 13:16:49 +08:00 via Android
    vmp 加壳
    anviod
        5
    anviod  
    OP
       2022-08-31 13:26:17 +08:00
    @zjsxwc
    @sdcg1994
    是的,遇到逆向确实头疼,要考虑反调试, 目前套一层自研的壳只覆盖了 X86_64, amd64; 其他平台 ARMV7 ARM64 RISC-V 完全是裸奔.
    mosfet
        6
    mosfet  
       2022-08-31 13:57:07 +08:00   ❤️ 1
    最简单的就硬件加密狗吧

    软件启动就验证,很容易反编译注释掉吧
    验证的代码要藏好,最好是随机触发

    不过离线软加密终究还是防君子不防小人

    硬件自己开发的,就考虑加个诸如 ATSHA204A 之类的芯片
    heguangyu5
        7
    heguangyu5  
       2022-08-31 14:30:21 +08:00   ❤️ 2
    看下这个 https://0xnobody.github.io/devirtualization-intro/
    不要和搞逆向的斗智斗勇.

    要转换思路:
    1. 任何授权到最终都是一个 if 判断,搞掉这个判断授权就绕过了.
    2. 不能假设别人定位不到这个 if.
    3. 虽然能定位和绕过授权判断,但这需要时间,比如 10 分钟?
    4. 添加足够多的授权判断.

    我这边也是做 toB 的,并且是用 PHP 开发的.
    为了保护源代码和搞定授权,开发了一个名为 bpc 的编译器.
    bpc 在编译 php 代码的过程中,在合适的位置插入授权判断,插入数量由参数控制.
    思路供参考.
    https://bpc.dev
    nothingistrue
        8
    nothingistrue  
       2022-08-31 15:51:13 +08:00   ❤️ 1
    有两个问题:
    第一,签名生成过程要私钥,授权开始时间还好说因为你这是人工授权,软件每次运行时间这种实时信息是没法进入签名的。软件每次运行时间这一块,你不联网是很难验证的。
    第二,签名之后的证书信息或加密信息,你总要随软件主体一起给出,这个不用硬件加密狗就总有被复制的可能性。
    s7lx
        9
    s7lx  
       2022-08-31 16:55:43 +08:00   ❤️ 1
    参考下 2000-2010 年期间加密与解密是怎么斗智斗勇的:

    - 起码不能留下明显的“if"的地点,不然破解是分分钟的事(叫“破解”)
    - 非对称加密是个办法;
    - 最好是关键模块授权,一机一期一个文件。续费、换机都要重新部署这个模块
    anviod
        10
    anviod  
    OP
       2022-08-31 17:50:43 +08:00
    @nothingistrue
    @s7lx
    @heguangyu5
    @mosfet
    公钥是硬编码在软件代码中, X64 自己的壳, 激活就是私钥签发一个激活文件 (授权主题加密和私钥签名)这个好处理, 每次运行会在内存上存储一份反序列化的变量 上次运行时间和本次运行时间,会监听系统信号,在程序退出时 修改本次运行时间, 最终文件加密落盘到硬盘, 下次启动读文件如果被修改,就重新激活
    (目前是配合硬件加密狗来解决的, 但是发现市场上 打狗棍的产品
    sdcg1994
        11
    sdcg1994  
       2022-08-31 21:31:01 +08:00 via Android   ❤️ 1
    @anviod 加暗桩呗,内部埋各种校验,触发也不报错不退出,就是在适当的时候出些恶心的问题,比如 1+1 算成了 3 ,日志莫名其妙消失种种,winhex 就这么干的,市面上的破解就没有完美的
    ragnaroks
        12
    ragnaroks  
       2022-09-01 08:25:01 +08:00   ❤️ 1
    道高一尺魔高一丈,这个问题无解;建议把部分功能做成硬件提供的,一张 PCIEx1 的成本就十几块,这样被破解的时间能延长很多
    anviod
        13
    anviod  
    OP
       2022-09-01 09:06:01 +08:00
    @ragnaroks
    @sdcg1994
    这个思路可以, 反正是没有绝对的安全,最多浪费对方的破解成本, 那么每次升级新功能 暗装也跟着修改一下. 对于硬件可以外挂的方式也不错, 我去了解一下这个思路. 毕竟服务器大量空闲 PCIE 接口
    ijrou
        14
    ijrou  
       2022-09-06 09:58:45 +08:00
    功能的话,全部走服务器,然后你怎么离线授权都可以
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1143 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:36 · PVG 02:36 · LAX 10:36 · JFK 13:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.