引言
常用SDK最终交付对象可能为内网用户,由于其不能够连通公网服务器,因此SDK需要具备离线(脱机)激活与授权的能力。
1. 需求
1. C端用户在脱机条件下能够正常激活
2. SDK在一定有效期内使用,或者限制次数
3. 限制用户设备及数量等
4. 避免虚拟机攻击,撰改系统时间等攻击
2. 拟定方案
2.1 纯离线模式
思路
-
开发者提供授权文件(授权文件包含有效期,License等信息),将之交付给C端用户
-
C端用户获取授权文件后,将之放置在指定目录
-
程序运行时对授权文件进行校验,判断License是否有效及对比当前时间与授权文件初始时间,用以判断是否过期,最终返回是否激活成功
弊端
-
纯离线模式下我们无从得知C端用户的电脑信息(机器指纹),理论上授权文件提供给任何机器都能够正常使用
-
用户可以通过修改系统时间,使电脑始终处于有效期内,如果授权码为永久有效尚可,但如果是存在有效期,则该有效期形同虚设
-
其实造成上述问题的主要原因是,在纯离线模式下,我们无法区分不同C端用户的电脑信息,无法唯一标识之。
2.2 离线模式
思路
-
C端用户电脑运行程序生成机器指纹(含CPU、硬盘、MAC地址等一种或者几种信息的加密数据),同时获取当前系统时间等,统一加密编码为一定位数的License(由于可能C端用户无法联网,因此可能需要通过摘抄等方式,这就要求License不能太长)
-
C端用户将License发送给S端服务器,S端服务器对License进行解密及分析,得到C端机器码及系统时间等
-
S端服务器根据C端用户信息,生成授权证书(包含C端限定SDK使用期限),并进行加密,并将之交付给C端用户
-
C端将授权证书放置在指定目录,SDK运行前对授权证书进行解密,得到第1步提交的机器码及SDK有效期
-
C端校验当前主机的机器码与证书中的机器码是否一致,同时判断当前系统时间是否超过证书中的有效期,最终返回激活是否成功
弊端
-
C端用户主机更新硬盘,CPU,网卡,刷BIOS等会使机器码发生变化,SDK运行校验时造成失败
-
无法应对虚拟机及修改时间等攻击
2.3 在线模式
对于在线系统通常的做法是设计与部署一个认证服务,软件链接登陆服务获得认证信息(License)实现,当然也可以一旦通过验证,将License本地存储使用。
弊端
-
需要要求用户能够连通公网
-
需要额外的服务器开销
3. 总结
综合考虑三种方式,我们选用离线模式加密授权方式将较为合适,其中并非真的需要有服务器支持,由开发者代替服务器职能亦可。
4. 参考
https://patents.google.com/patent/CN103780600A/zh