对于绝大多数软件开发者而言,盗版始终是挥之不去的隐忧。即便使用了加密锁,软件就真的万无一失了吗?从理论上讲,没有任何软件是绝对无法破解的——即便是纯数学的密码体系,也存在着被攻破的可能性,只不过所需的破解时间可能长到近乎天文数字。
目前市场上的软件加密锁主要分为两大类:带CPU的加密锁与不带CPU的加密锁。带CPU的加密锁具备独立计算能力,能够对加密数据、过程数据以及通讯接口进行动态密文处理,从而衍生出密文校验、自定义算法、程序移植等多种加密手段。而不带CPU的加密锁结构相对简单,加密强度较低,但成本低廉,适合预算有限的应用场景。
加密锁克隆技术及其破解方法
不带CPU的加密锁本质上只是一个外接存储单元,用户通过正确的通讯方式与锁内存储交换数据来实现加密验证。这类加密锁无论其软件加密算法多么复杂,从硬件层面来看都属于低端产品,市场上多数加密厂商的低端型号均属此类。如果破解者能够设法将锁内存储的数据读取出来——前提是硬件高手能够攻克数据读取的技术难题——那么这把锁就算被成功破解,进而可以制作出完全相同的复制品。这种破解方式通常被称为加密锁的“硬件克隆”。克隆技术的出现,将加密锁的发展推向了新的阶段。新一代的软件加密锁大多配备了密码保护或硬ID号,只要黑客无法获取相同密码的锁,克隆手段便无法得逞。
加密锁仿真与模拟攻击
那么,加密锁厂商就能高枕无忧了吗?显然不是。解密者又找到了新的突破口:软件必须通过通讯接口与加密锁进行交互,黑客利用这一特点编写了仿真程序。其原理相当简单:先插上原装加密锁运行一遍软件,后台程序记录下所有写入和读出的数据;然后拔掉加密锁,启动仿真程序,让它模拟加密锁返回所有数据。针对这种仿真攻击,“蓝芯金盾加密锁”采用了源程序级加密技术——不是简单地判断某个数值或字符串是否正确,而是让输入参数随时间动态变化,确保任意两个时刻都不会出现相同的数据。
自定义算法加密锁的安全特性
市场上还有一种允许开发者自定义算法的加密锁产品。开发者可以将自己的算法写入加密锁中,在软件运行时调用这些算法完成特定的计算任务。其实现原理是将一组算法编译码后下载到加密锁的外部存储器中。这种方法存在一定局限性——外部存储器使用专用设备仍有可能被读取出来,因此安全强度最终取决于硬件读取方法的防护难度。“蓝芯金盾加密锁”能够为有特殊需求的用户编写专门的加密函数,更安全地将用户的要求融入加密锁中,用户不再需要判断锁是否正确,而是让锁本身来实现软件的特定功能。
实际上,加密锁本身的优劣只是一个方面,无论功能多么丰富、加密强度多么强大,更关键的是使用者如何部署和运用——毕竟软件最终要交付给用户使用。希望所有加密锁使用者都能善用手中的工具,切实保护好自己的软件资产。
提升加密效果的实用技巧
在具体实施中,一些技巧能显著提升加密效果:
在很少使用的代码路径中调用加密锁,这样即使程序看似已被破解,也会频繁出现异常现象。
根据时间因素调用加密锁——例如将上午调用的数据留到下午或隔日才使用,破解者分析这些数据需要花费一整天甚至数天,足以拖垮其破解进度。
加密锁的校验函数不应单独定义成一个独立的函数,而应分散成多个小函数分布在程序各处。
检查程序代码的校验和,防止文件被非法篡改。
以各种随机访问操作来掩护真实的加密锁访问,对随机询问的结果进行处理但不实际使用。
在加密锁的多个地址预先写入不同的数据,校验时随机选取某个地址进行校验(例如随机生成一个数,根据该数决定校验哪个地址)。
在程序的不同位置对加密锁进行检测,即实施多点加密,可配合第一种方法增强效果。
在程序运行过程中,定时或不定时地对加密锁进行随机检测。
从加密锁获取返回数据后,不立即判定结果,而是稍后再进行判断;当判定错误时,不立即提示或退出,而是延迟提示,或者让程序照常运行但出现偏差、溢出等异常。
将加密锁的返回值用作数组索引、常量、计算单元或校验码;用作指针控制程序执行,或作为在不同表中跳转的索引;也可用于加密或解密部分代码或数据,使用后立即清除。
加密锁工作原理
有一种加密锁的工作原理是将用户定制的密码算法(根据密码系数进行变换)写入锁中,以程序形式对调用者进行身份验证。
常见加密方式:内嵌式与外壳式
内嵌式加密:这种加密方式要求具备源程序,在待加密的程序中直接调用加密锁的接口。驱动光盘中提供了VC、VB、VFP、Delphi、PB、CB等多种编程语言的接口和详细示例。
外壳式加密:外壳加密直接对可执行文件(.exe、.com、.dll)进行加密,无需源程序,加密过程简单快捷。
文件加密功能
加密锁的动态链接库(DLL)中提供了文件加密与解密函数,函数内部封装了HASH和RSA密码算法的实现细节,安全性极高且使用方便。用户只需输入文件名和口令即可完成加密或解密操作。
反破译机制:文件完整性检测
利用程序的完整性检测码,可以防止文件被非法篡改。
定义1:运行检测码——程序运行时的完整性检测码。
定义2:发行检测码——程序发行时的完整性检测码。
检测原理:根据程序完整性判断程序是否被修改。在程序发行前计算“发行检测码”,程序运行时自动计算“运行检测码”。如果两者相等,则说明完整性无误,程序未被修改;否则表明程序已被篡改。
