CodeMeter的安全性

Lars Møller avatar

WIBU

2023-08-09

CodeMeter是一款全功能软件加密及授权管理解决方案,几乎能满足所有需求。以下是来自德国威步资深销售顾问Mr. Kuegler的亲身体验,通过以下对话情景,软件开发者对CodeMeter的安全性可窥一斑。

见一叶而知深秋,窥一斑而见全豹
CodeMeter是一款全功能软件加密及授权管理解决方案,几乎能满足所有需求。以下是来自德国威步资深销售顾问Mr. Kuegler的亲身体验,通过以下对话情景,软件开发者对CodeMeter的安全性可窥一斑。
窗帘没有拉上,也没有刺眼的强光直射我的脸,但整个情形还是让我感觉有点像在接受审讯。我坐在桌子的一边,来自某全球知名企业的两位高管坐在另一边面对着我。经过两个小时这样的对话,我终于听到了我一直期盼的那句话:“Kuegler先生,我知道没有什么是100%安全的,但CodeMeter似乎是市场上最好的选择。”
让我们还原一下我们的对话过程。

​X先生:那么请问Kuegler先生,AxProtector到底是如何加密软件的?

这个问题对我来说很容易回答:CodeMeter保护套件达到了性能和安全的最佳平衡。使用CodeMeter加密软件时,通过256位AES对称算法对应用程序本身及程序的部分内容进行加密,并会创建一个或多个伪随机软件密钥。然后,密钥本身被加密,并使用CodeMeter许可证中包含的CodeMeter组合密钥存储在软件中。
当应用程序运行或访问加密部分时,CodeMeter组合密钥中的其中一个被选择用来解密软件密钥,进而解密软件。如果缺少正确的许可证,就无法获得必要的解密密钥,软件无法被解密或执行。
​AxProtector软件加密工具

X先生:是不是软授权CmActLicense的安全性比硬件加密狗CmDongle的安全性会更弱一些?CmDongle硬件加密狗采用大家都熟知的USB接口,但CmActLicense则使用非对称加密过程。

我的回答:要加密像应用程序这样的大量数据,始终需要对称加密,比如256位AES算法 。如果希望一个安装包适用于每个客户,不同的许可证必须包含相应的解密密钥。无论是使用CmDongle、CmActLicense还是云锁CmCloudContainer,对称算法的密钥都是通过非对称的过程转移到许可容器中,然后存储于容器中。只是不同点在于:硬件加密锁CmDongle提供智能卡安全芯片用于安全存储,软锁CmActLicense提供与设备属性绑定的许可证文件用于安全存储,而云锁CmCloudContainer提供云中存储。如果使用硬锁CmDongle或云锁CmCloudContainer,CodeMeter密钥永远不会进入软件端设备的内存;而软锁CmActLicense则不同,它必须将密钥存储在内存中,但只是片刻,并通过额外的反逆向工程功能进行保护。但请记住:窃贼永远无法窃取从未存在过的东西。

X先生:但可否尝试监听USB接口并模拟硬件锁?

我的回答:再次强调,CodeMeter采取了以下多层防护措施:首先,CodeMeter Runtime和CmDongle硬件之间的通信始终是加密的,并且许可证中的每一组对称密钥都包含了一组非对称密钥。受保护的对称密钥会创建一个随机挑战,CmDongle硬锁必须使用私钥来回应,然后软件使用公钥检查挑战,没有私钥,则根本无法伪造校验。但这并不是全部:正如我所说,我们使用CodeMeter组合密钥加密软件密钥,这个过程则创建了大量密钥对组合,而仅有其中一组密钥在软件启动时被选择。该设计旨在确保软件每次启动调用的密钥均不相同。这意味着通过侦听记录通讯过程的模拟器是根本不完整的,其运行的功能也将受到严重限制。

X先生:但是软件更新呢?是使用相同密钥吗?或者每次更新(即使是小更新)创建一个新的许可证会不会更安全?

我的回答:没有必要每次更新都创建新的许可证,即使使用相同的许可证同样可以高强度保护每次更新。关键点在于:CodeMeter不仅为软件提供安全保护,同样简化及优化授权过程。每个许可证背后都有一个根密钥,即产品选项密钥(PISK),在加密期间(在CmDongle上)创建所需CodeMeter密钥,该密钥由加密后的应用程序校验和派生出来的。
相同应用程序/相同许可证 -> 相同密钥 -> 相同受保护的应用程序。
不同的应用程序(例如,在小更新后)/相同许可证 -> 不同的密钥 -> 不同的受保护应用程序。

X先生:我的同事可通过旁路攻击等手段读取我们自己芯片上的密钥,那么我们是不是可以采用同样方法从CmDongle获取密钥?

我的回答:不可以。首先,CodeMeter硬件加密锁的核心部件为通过EAL5+安全认证的智能卡芯片,该芯片由制造商配备了防旁路攻击的各项措施;其次,CodeMeter固件中使用了一些自己的技巧阻止旁路攻击;最后,由于PISK许可证密钥不能直接使用,所以根本无法直接攻击根密钥。

X先生:我希望只加密软件,保护代码安全,无需授权管理,CodeMeter的IP保护模式的安全性如何?

我的回答:坦白说,纯IP代码保护无法达到CodeMeter提供许可证的保护的安全级别。使用CodeMeter许可证,软件需要访问存放在安全容器中的密钥,而IP保护模式下,软件密钥被加密,但密钥则存放在受保护的应用程序中。当然纯软件保护方案中,如何隐藏密钥是我们的关键能力之一,不好意思玩了个文字游戏,但是我们还是认为将软件和许可证分开自然会增加保护水平。

X先生:我是否正确理解:本地C/C++应用程序的全自动保护优于.NET应用程序?使用.NET,是不是更容易被读取中间代码?

我的回答:采用CodeMeter,事实恰恰相反。使用AxProtector .NET,安全级别会高于AxProtector Windows,因为AxProtector Windows一次性加密和解密整个应用程序,而AxProtector .NET将应用程序拆分为单独的功能,逐块加密;代码只有调用的部分在运行时被解密,转化为机器代码,然后立即从工作内存中删除。这大大提高了保护水平。

X先生:攻击者能不能简单地读出并解密.NET应用程序的每个功能?

我的回答:理论上,这是可能的,称之为静态分析,因为代码没有被执行,这与动态分析不同。AxProtector .NET具有内置的大量陷阱阻止静态分析,这些陷阱看起来像常规代码,但是当攻击者解密它们时会锁定许可证,许可证将变得无用,一旦触发陷阱,破解者甚至无法通过静态分析继续解密应用程序的其余部分。
对于本机应用程序,例如C/C++、Delphi、Fortran等,还可以在运行时选择动态解密和陷阱设置。开发者可以在代码中自定义按需解密及大量陷阱,只是相比.net方案开发者需要额外投入一些开发工作。

X先生:如果我想用CodeMeter和AxProtector获得最高的安全保护水平,您会推荐什么?

我的回答:对于C/C++应用程序,AxProtector引入了一种新类型的混淆工具,称之为CTP(编译时保护)。其通过在编译时更改应用程序使其结构变得无法识别以实现保护,该技术的安全性远超出了IP保护模式,有没有CodeMeter许可证都不影响使用。不过,开发者需要一个全新的Clang编译器工具。
如果使用CmDongle或CmCloudContainer,我建议开发者可将特别敏感的代码的运行移至CmContainer硬件加密锁中。代码由开者选择并进行加密,运行时则在CmContainer许可中解密及执行,这种机制称之为CodeMoving,其是防止逆向工程的最高武器,因为破解者都无法在运行环境中包括内存中看到这些代码未加密时的形式。
坐在我对面的两位软件业大佬,对我把CodeMeter安全性能进行的完整、详尽的解释表示了感谢,特别是对我们承认加密技术仍有潜在局限性的坦诚表示认可。威步对这些细节的公开态度更有利于CodeMeter的发展和进步。140年前的Auguste Kerckhoff就清晰地看到,真正的安全不可能通过保密方法和机制来实现,而应该是即使加密系统的任何细节已为人所知,只要密钥未泄露,就是安全的这种方式。正如两位大佬所同意的,CmDongle硬件加密锁是保证密钥安全的完美之地。
免费试用
0