[问答]Golang Go语言中软件离线授权比较稳妥的方案

发布于 1周前 作者 wuwangju 来自 Go语言

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

  • 获取当前系统信息
        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 语言解决方案? 硬件安全狗?


[问答]Golang Go语言中软件离线授权比较稳妥的方案

更多关于[问答]Golang Go语言中软件离线授权比较稳妥的方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

15 回复

硬件坏了怎么办?需要换到其他电脑怎么办?

更多关于[问答]Golang Go语言中软件离线授权比较稳妥的方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


目前 ToB 的业务需求就有限制更换服务器,所有授权必须厂家人工授权, 所以不考虑更换服务器的事情.

可以通过反汇编跳过判断语句来破解



是的,遇到逆向确实头疼,要考虑反调试, 目前套一层自研的壳只覆盖了 X86_64, amd64; 其他平台 ARMV7 ARM64 RISC-V 完全是裸奔.

最简单的就硬件加密狗吧

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

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

硬件自己开发的,就考虑加个诸如 ATSHA204A 之类的芯片

看下这个 https://0xnobody.github.io/devirtualization-intro/
不要和搞逆向的斗智斗勇.

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

我这边也是做 toB 的,并且是用 PHP 开发的.
为了保护源代码和搞定授权,开发了一个名为 bpc 的编译器.
bpc 在编译 php 代码的过程中,在合适的位置插入授权判断,插入数量由参数控制.
思路供参考.
https://bpc.dev

有两个问题:
第一,签名生成过程要私钥,授权开始时间还好说因为你这是人工授权,软件每次运行时间这种实时信息是没法进入签名的。软件每次运行时间这一块,你不联网是很难验证的。
第二,签名之后的证书信息或加密信息,你总要随软件主体一起给出,这个不用硬件加密狗就总有被复制的可能性。

参考下 2000-2010 年期间加密与解密是怎么斗智斗勇的:

- 起码不能留下明显的“if"的地点,不然破解是分分钟的事(叫“破解”)
- 非对称加密是个办法;
- 最好是关键模块授权,一机一期一个文件。续费、换机都要重新部署这个模块





公钥是硬编码在软件代码中, X64 自己的壳, 激活就是私钥签发一个激活文件 (授权主题加密和私钥签名)这个好处理, 每次运行会在内存上存储一份反序列化的变量 上次运行时间和本次运行时间,会监听系统信号,在程序退出时 修改本次运行时间, 最终文件加密落盘到硬盘, 下次启动读文件如果被修改,就重新激活
(目前是配合硬件加密狗来解决的, 但是发现市场上 打狗棍的产品

加暗桩呗,内部埋各种校验,触发也不报错不退出,就是在适当的时候出些恶心的问题,比如 1+1 算成了 3 ,日志莫名其妙消失种种,winhex 就这么干的,市面上的破解就没有完美的

道高一尺魔高一丈,这个问题无解;建议把部分功能做成硬件提供的,一张 PCIEx1 的成本就十几块,这样被破解的时间能延长很多



这个思路可以, 反正是没有绝对的安全,最多浪费对方的破解成本, 那么每次升级新功能 暗装也跟着修改一下. 对于硬件可以外挂的方式也不错, 我去了解一下这个思路. 毕竟服务器大量空闲 PCIE 接口

功能的话,全部走服务器,然后你怎么离线授权都可以

针对Go语言中软件离线授权的比较稳妥的方案,以下是一些专业建议:

首先,非对称加密(如RSA)是生成安全授权码的理想选择之一。在授权码机制中,服务端生成的私钥用于加密和签名,不会向客户端公开,客户端通过公钥验证授权码的合法性,避免明文传输带来的安全风险。在Go语言中,可以使用crypto/rsacrypto/rand包来生成和使用RSA密钥对。

其次,在授权实现上,可以考虑使用令牌(Token)或者许可证文件的方式。对于令牌方案,服务端生成一个包含授权信息的令牌,客户端在离线状态下使用这个令牌进行验证。对于许可证文件方案,服务端生成一个包含授权信息和验证逻辑的文件,客户端在离线状态下加载这个文件进行验证。

最后,为了确保授权的安全性,还需要注意以下几点:

  • 密钥管理:确保私钥的安全存储和访问控制,避免泄露。
  • 令牌或许可证文件的保护:防止被篡改或复制。
  • 定期更新:定期更换密钥或令牌,降低被破解的风险。
  • 监控和日志记录:对授权过程进行监控和日志记录,及时发现和处理异常行为。

综上所述,采用非对称加密、合理的授权实现方式以及严格的安全措施,可以构建出比较稳妥的Go语言软件离线授权方案。

回到顶部