[问答]软件离线授权比较稳妥的方案 - V2EX
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 3247 次点击
    这是一个创建于 1205 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 获取当前系统信息
     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     Solana     5150 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 09:13 PVG 17:13 LAX 01:13 JFK 04:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86