电子授权是国际上使用最广泛的应用程序和数字内容保护方案。因为不需要额外的安全硬件,电子授权可以节省大量的物流、库存以及管理费用,并且具有更高的灵活性和稳定性。
授权模式
电子授权一般采用“一次开发,多次授权”的机制,将
软件代码与授权方案区分开来。电子授权主要有
云授权和本地授权两种模式。
云授权
云授权是完全由服务器进行授权存储和验证的强授权模式。它的独特之处在于所有与授权相关的安全数据及运算都交由Internet服务器完成。客户端需要通过网络连接调用服务器方法,并与服务器保持心跳连接。
云授权的优势是安全性非常高,并且可以由服务器进行实时管理,但要求客户端具有长期在线的联网能力。
云授权在国外的游戏软件中应用比较广泛。包括育碧(Ubisoft)和暴雪(Blizzard)在内的顶级游戏软件制作商都在最新产品中包含了类似
云授权的技术,并取得了很好的保护效果。国际上最大的在线游戏销售平台Steam也对
云授权提供了支持。
本地授权
是较为传统的电子授权方式。当客户端应用程序连接服务器完成在线激活之后,服务器会在客户端生成一个与本地硬件指纹绑定的客户端许可文件,并记录客户端的激活信息。开发商可以对本地授权设置“智能连接”和“强制认证”两个服务器验证属性。在这种情况下,本地授权会自动(智能连接模式)或在指定周期内(强制认证周期,如15天)与服务器连接一次,完成授权的周期性验证和升级。
本地授权支持以下几种模式:
1、单机授权——授权用于一台或多台单独的终端电脑。
2、集团授权——授权用于集团内部。集团授权需在局域网内安装单独的本地授权服务,并为集团
管理员提供了本地管理工具界面。
3、试用授权——授权用于实现软件的试用功能。试用授权使用相同的授权码,可用于任意数量的客户端机器。每一个客户端都可在试用期内进行软件试用。
安全设计
从安全角度考虑,电子授权的安全设计主要有下面几个重点。
环境指纹的选取和采集
电子授权对应用环境的软、硬件指纹的选取基于三个原则:
1、具有一定程度的唯一性。
2、不易被复制。
3、对不同指纹进行组合。
目今为止,一般用户的计算机上还不存在具有高度唯一性并且无法被修改的软、硬件指纹特征。可以采用下面的选取策略:
(1)选取一、两种不可被修改且具有较好唯一性的指纹作为主硬件指纹,如CPU特征。CPU特征中包含了厂商信息、型号、批次、制程及出厂设置等众多信息,不同
客户端上重复的几率很低。
(2)选取几种辅助指纹信息,用于降低环境指纹重复率。如网卡、硬盘信息等。
(3)选取几种参考指纹信息,不用于环境绑定判断,但可用于软件开发商进行人工识别和判断参考。如机器名、用户名、IP地址和软件版本等。
通过上面的策略,可以得到唯一性非常高的可靠的环境指纹信息。由于CPU等硬件信息是无法被修改的,因此安全性很高。
安全库调用过程保护
前面提到,软件破解的方法之一是监视客户端安全库API调用过程,并伪造返回结果。相比基于专用硬件的保护方式,电子授权对API调用过程保护有自己的优势和劣势:
1、
云授权由互联网上的授权服务器进行应用程序的授权和API调用的实现,客户端与服务器之间的通信使用随机会话密钥,具有很高的安全性。
2、基于本地环境指纹采集的API调用过程的通讯数据无法被完全加密。应用软件与安全库之间的通讯是安全的,但采集指纹必须基于标准的系统功能调用。
3、与系统功能有关的系统调用很难被篡改,而且修改过程容易给系统造成损害,影响用户的正常使用。
综合来说,经过精心设计的电子授权API调用过程可以获得很高的安全强度,迫使破解者必须通过分析或修改安全库才能了解或绕过具体安全过程,使对API过程的破解失去意义。
逆向工程破解保护
一旦破解者采用对应用程序进行逆向工程的破解方法,其安全程度已经与底层授权机制无关,更多的取决于软件开发商在集成授权模块代码时所应用的安全技巧。
最简单有效的安全技巧包括在应用程序的多个关键位置进行授权验证、API调用点与返回值判断点的距离要远、尽量让API返回结果与应用程序运行状态相关等等。
双因素保护机制
客户端安全库可以采用“双因素保护”的安全机制。简单的说,就是将本地授权机制与服务器验证相结合。
双因素保护不仅为客户端授权验证增加了一重保护,而且因为在服务器验证的同时对客户端信息作了记录,为软件破解提供了可追踪和可补救的可行方案。
破解者完全移除应用程序代码中的安全验证比软件破解本身要困难得多。
这是因为一般的软件破解都以“软件功能可用”为目的。这一方面是因为破解者希望减少破解时间;另一方面也是从技术上,破解总是以软件运行时的出错点或API调用点为基础而进行的。
因此,绝大部分的
破解版软件都不能做到100%的破解。这对于传统的本地授权方式(包括基于专用硬件的保护方式)没有太大的影响,但对的双因素机制来说,软件开发商可以因此对破解行为进行追踪,或对破解进行补救。
举例来说,软件开发商可以在
软件代码的非关键路径上调用客户端安全库的Update函数,并根据返回值进行错误处理。每次调用Update函数时,如果客户端存在网络连接,将会在服务器端留下相应的记录,并同步开发商在管理系统中的设置。如果发生破解,开发商将会发现同样的授权码在不同的机器上的使用记录,进而可以选择禁用这些授权码。应用程序将在下一次Update时对自身状态进行更新。
开发商也可以针对破解程度,选择快速发布一个软件的升级补丁,这个升级补丁对得到授权的用户将可以正常安装,而非授权用户在安装时将无法通过服务器验证,必须再次实施破解过程或者继续使用老的应用程序版本。