确保开发成果不被恶意篡改的最佳方式是什么?
作为一个应用程序开发人员,在投入如此多时间和精力后,你绝对不会希望自己的辛苦成果被恶意篡改。为了确保应用程序或内容在没有安全漏洞或经过任何修改的情况下安全抵达终端用户,如何保证代码或文件的安全性,不被他人任意修改呢?
答案是:代码签名证书
它通过对程序代码的数字签名,来标识软件来源以及软件开发者的真实身份,为可信计算环境提供技术支撑,能有效保障软件在开发、构建、分发、维护过程中可信任、不被篡改。证明该代码没有被非法修改和破坏,确保了该代码的可信度和有效性。其通过加密技术对文件的扩展名进行签名,一旦文件被改动,即会通知文件作者,保护文件的安全性。从而让用户确信下载的软件真实可靠,放心下载软件代码。
代码签名证书功能的实现原理
代码签名的基础是PKI安全体系。代码签名证书由签名证书私钥和公钥证书两部分组成,其中,私钥用于代码的签名,公钥用于私钥签名的验证和证书持有者的身份识别。结合证书的公钥和私钥,其具体的实现步骤为:
1.申请数字证书:发布者从CA机构申请数字证书。
2.发布者开发出代码:借助代码签名工具,发布者使用MD5或SHA算法产生代码的哈希值,然后用代码签名证书私钥对该哈希值签名,从而产生一个包含代码签名和软件发布者的签名证书的软件包。
3.运行环境访问到该软件包:用户的运行环境访问到该软件包,并检验软件发布者的代码签名数字证书的有效性。
4.使用代码签名:用户的运行环境使用代码签名数字证书中含有的公钥解密被签名的哈希值。
5.新产生一个原代码的哈希值:用户的运行环境使用同样的算法新产生一个原代码的哈希值。
6.用户的运行环境比较两个哈希值:用户的运行环境比较两个哈希值。如果相同,将发出通知声明代码已验证通过。所以用户可以相信该代码确实由证书拥有者发布,并且未经篡改。
流程示意图
代码签名证书的实际应用
随着移动和桌面设备个人用户应用程序呈爆炸性增长以及恶意软件的激增,越来越多的软件发行商和移动网络提供商要求提供来自受信任的证书颁发机构 (CA) 的代码签名,否则不接受分发的代码。诸如安卓、苹果等操作系统就强调对代码进行了签名的应用程序的重要性。
由于互联网缺乏提供软件额外信息的机制,用户通过互联网下载或打开软件时,通常会看到一个消息框,警告运行该软件可能造成的危险,令软件产品缺乏完整性保护且(或)发布者不详,从而导致用户对此软件产品的信任度降低。
以微软代码签名为例,当你在Windows系统上下载软件时,使用代码签名的前后区别如下所示:
➤ 你没有微软代码签名证书,该下载会被Windows系统阻止,并提示“未知”发布者的安全警告:
➤ 你有微软代码签名,下载时会显示开发者姓名或是开发商名称,以便让用户知道该软件的合法性,确定可放心使用。
代码签名证书的种类
按照代码签名证书产品类型划分,可以分为以下两种类型:
1. 代码签名证书(Code Signing)
它是为软件开发者提供的一个理想的解决方案,使得软件开发者对其软件代码进行数字签名,确保用户下载的内容来自所声明的来源。
2. EV代码签名证书(Extended Validation Code Signing)
EV代码签名证书是利用一个存储在外部硬件令牌上的密钥(硬件Ukey)来进行签名,在原代码签名证书基础上加强了对企业身份的验证。
在我们日常工作中,不同类型的代码签名证书,支持的功能略有不同,常见的功能支持如下所示:
传统代码签名证书的痛点
2018年,一款拥有 Windows 和安卓双版本的挖矿木马 MServicesX 悄然流行,中毒电脑和手机会运行门罗币挖矿程序,造成异常发热乃至设备受损的现象。此木马软件是如何躲避安全软件的查杀,成功诱导用户安装?值得注意的,木马文件 MServicesX_FULL.exe 使用合法的数字签名 “16qp limited”,还发现多个拥有合法签名的同类样本,样本的签名包括“Spinex Solutions Ltd”、
“Extrebal limited”、“Kupui ltd”等,在这些白签名的掩护下,挖矿木马 MServicesX 得以“瞒天过海”,成功入侵用户电脑。
我们可以大胆猜测,签名挖矿木马 MServicesX 的合法密钥有可能是盗来的,密钥拥有者甚至没有审计与此密钥相关的所有活动,谁?什么时候?签了什么文件?他们都一无所知。
代码签名用来保护知识产权和信誉。确认软件开发商的身份,证明自签名后软件未被修改和纂改。然而在代码签名的实际应用中,存在着诸多问题,面临着诸多的安全风险。
例如:跨区域签名,我们无法保证 UKEY 传输过程的安全性;多部门需要同时签名的场景中,密钥分身乏术,即使我们选择为这张证书购买多把 UKEY 分发给多个部门使用,可我们无法追踪 UKEY 里的证书是否被用来签恶意软件?签名密钥容易被盗;无法跨区域共享密钥;没有签名问责制和管理权利,无法跟踪或审计签名活动等等,代码签名威胁态势严峻。
图:传统代码签名的安全痛点
在复杂多变的网络环境下,我们需要一套签名系统:解决跨区域跨部门多人签名需求的问题;我们需要一套审计系统记录每一次签名 :谁、什么时候、签了什么文件。而分散的部门和机构导致操作员的身份很难被验证,怎么证明签名者是谁呢?用账号密码吗?
组织保持强大的网络安全实践并将其证书和相应密钥存储在安全的环境中比以往任何时候都更加重要。我们需要一套更安全可靠的鉴权方式 :不可复制、抗抵赖、与通用系统集成使用的便利性。
突破传统:更安全可靠的远程代码云签名解决方案
跨地区跨部门多人签名: VSign解决多地区多部门需要同时使用同一张证书签名的难题,不仅保护证书和私钥的安全,而且所有的签名活动都是可追踪的,确保问责制和合规性。
共享证书实现隔空签名: 云端服务器通过令牌实现证书共享,证书拥有者不必担心证书的安全问题,请求签名的用户可以体验到无感知的签名服务。
满足全部安全需求
△ 消费者应用程序:无法随时掌控所有密钥使得企业和消费者易遭受攻击。
△ 内部应用程序:内部开发过程中的代码签名安全流程和掌控的复杂性和难度会带来重大风险。
△ 第三方市场:在许多开发人员之间共享密钥会使他们远离组织的可见性和控制。
保护代码完整性和开发者信誉:对代码文件进行远程签名时,采用可信部件进行私钥签名,提高了代码签名的安全性。支持本地签名、共享签名、云签名等模式
其中共享签名模式可以将本地的签名证书(支持UKEY证书),共享给异地的朋友或同事使用而不传输私钥,这样将不会导致私钥泄露,安全可靠。
另外,使用者用共享证书签名时,共享者可以进行实时审批,防止共享证书滥用的情况发生。当然如果信任对方,也支持自动审批。