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

2022-08-31 11:12:43 +08:00
 anviod

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

        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

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

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

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876663

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX