基于规则验证的软件授权验证思路

基于规则验证的软件授权验证思路

 有时候自己做的一个软件需要按照授权来进行售卖,因此在软件设计的时候要考虑好如何进行授权管理。

 下面我们来讨论一种基于规则验证的软件授权思路:

 基于的软件授权验证需要校验两个方面:

  1. 授权信息,即是软件在这台设备上否可用的问题。
  2. 到期信息,即当前时间软件在这台设备是否可用的问题。

 因此在软件授权过程中,我们需要加密存储在客户端的信息有两项信息:

  1. 设备可用性信息
  2. 时效信息

 假设我们使用64bit来存储以上两项信息,那么我们可以使用一个64bit的信息来表示软件授权信息:

0-31bit 可用性信息
32-63bit 时效信息

 在以上讨论中,可用性信息一般情况下我们只需要0或者1即可,表示可用与不可用,其实更简单的方式是有授权信息的存在,则表示可用,无授权信息的存在则表示不可用。

 时效性信息我们一般会采用时间来进行验证,32bit的时间信息按照timestamp的方式来进行表示的话也足够我们用到2038年,为了增强可用性我们可以使用偏移时间,即在某个时间点之后的时间来进行验证。当然,当前时间的获取我们肯定不能依赖于当前设备的时间。

 整体的流程上,我们先来梳理一下:

  1. 下发授权
    生成符合规则的字符串->加密(对称加密/非对称加密)->下发给软件使用的用户
  2. 规则验证
  1. 获得符合规则的字符串->解密->验证可用性->写入加密信息到授权文件
  2. 软件运行->验证可用性->验证时效性->以上两项都验证通过即可执行软件功能

 整体上我们采用离线实时验证和在线不定期校验的方式来进行。假设离线验证被■■那么在在线不定期校验的时间窗口内软件还是继续可用的。

 我们来梳理一下以上情况可能会出现的问题:

  1. 规则的设计

 简单的规则设计会影响的是软件的被■■的概率有多大,简单的规则设计会导致软件授权很容易被■■,基于离线和在线的软件验证方式都是有问题的,离线软件授权验证当软件被tweak的时候失效,在线的授权会被mimt攻击导致验证失效或错误。

 为了增强软件授权的安全性,从规则方面,尽可能的设计较复杂的规则来防止通过授权码比对的方式来进行■■,另外规则也需要不定时更新。

 为了增强离线软件授权的安全性,我们需要对程序进行加密处理,包括函数名混淆和指令混淆,分散多处验证的方式来增加离线■■的难度。

 为了增强在线验证的安全性,我们可以使用https来进行在线信息的验证和信息的获取。通过ua等其他方式的验证来保证客户端的请求是正常的用户请求。

 规则的更新上我们可以维护一个规则文件,非对称加密后存储到客户端,客户端维护当前规则的前N个版本即可。因为可能在规则更新后有人用老的授权码来进行验证。如果前N个版本规则都验证不通过则由服务器来进行验证。验证通过后更新客户端规则文件即可。对于恶意验证规则的用户可以采用多次验证不通过以后拒绝验证即可,包括客户端验证和服务器验证。

  1. 当前时间的获取与刷新
     首先对于时间的获取上我们可以采用定期获取,比如我们程序启动的时候获取一次服务器时间,然后定时刷新当前时间以维护当前时间和服务器时间的同步,那么如果程序挂掉怎么办?无法定时更新时间了。这里我们采用的是将线程挂载在关键系统进程内,比如SpringBoard。系统关键进程重启,那么就会继续更新时间并重启时间定时器。接下来每三分钟或者五分钟获取一次服务器时间即可。

  2. 设备唯一id的获取
    采用现有的开源库结合多种id匹配就行了。

 这只是授权验证的一种大概思路。

1 Like
  1. 设备唯一id的获取
    采用现有的开源库结合多种id匹配就行了。

能介绍一下有哪些开源库可以做这个嘛?iOS or Android