在软件驱动发展的数字化社会里,信任至关重要,但软件行业在发展过程中,却存在着各类软件扎堆开发、流氓软件、间谍软件、木马程序横生等问题,普通用户很难分辨下载软件的真假。
在没有间谍软件和木马程序之前,用户可能还会信任某个软件就是他想要下载的官方软件,但到了今天,眼见的就不一定是真实的。互联网的匿名性使得用户根本无法确认此软件是否真的是官方开发商推行的软件!
如何保证软件代码在网络传输过程中不会被非法修改,同时还能让用户非常清楚地识别软件发行者的真实身份,答案就是代码签名。
开发人员使用代码签名来证明软件的合法性,并确保它的可靠来源并且未被篡改。
图片来源:百度
代码签名是什么
代码签名是一种向程序、文件、软件更新或可执行文件添加数字签名的技术,以便在安装和执行时可以检查其有效性和完整性。
它向接收者确保下载来源的正确,并且它没有被打开和篡改。
例如,为了证明用户的Windows 10 更新是来自 Microsoft的,Microsoft开发人员、程序员和软件工程师会在推送的更新里使用代码签名技术,让用户可以清楚辨认此次更新的来源。
图片来源:百度
通过代码签名用户可以确信下载的软件是否是官方正版文件,而不是会偷取个人数据信息的盗版文件。
本质上,通过代码签名用户能够知晓其下载的软件代码是否遭到更改,便于用户判断该软件在设备上安装和运行的安全性。
相信你曾经看到过当尝试启动已下载的软件时,会有一个弹出的小窗口并询问“您确定要运行这个吗”, 如果细心的话,你可以从该窗口上看到软件标识的发布者等信息。
代码签名有什么作用?
对用户来说,代码签名有几个不同的功能,首先可以帮助用户确定是否应该信任其下载的软件,其次代码签名还能用于验证文件和软件作者的身份。
例如,与任何其他来源的下载文件相比,安装来自Microsoft提供的文件才更安全可靠。
在日常的生活场景里,用户在计算机上安装的软件将不可避免地进行更新。基于代码签名下,用户可以确定后续更新来自同一来源。
图片来源:百度
代码签名如何工作?
从开发人员的角度来看,代码签名主要分为三个部分:未签名的软件文件;代码签名证书;和代码签名工具。通常Windows、Mac OSX等操作系统或证书颁发机构会提供代码签名工具。而代码签名证书通常来自证书颁发机构(CA)。
公钥加密
在加密中,对发送的消息进行编码以防止未经授权的用户查看,解码消息取决于能够将加密后的数值恢复到其原始状态的密钥,从而使消息能够被读取。
加密消息的密钥和解密它的密钥是不同的,它也被称为“公钥”系统,“公钥”用于保护通信,而 “私钥”则能避免第三人获取通信信息。
在加密中,私钥必须保持安全,用户需要保证其不会落入任何试图拦截或篡改消息的第三人手中。同时传输的种类决定了公钥是用于编码还是解码消息。
如果你想让每个人都能够阅读消息,但你不想让任何人篡改它,你就用私钥编码,用公钥解码。如果你想让每个人都能发送消息,但不想让他们被错误的人截获,你可以用公钥编码,但用私钥解码。
哈希函数
哈希函数又称散列函数,是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出的值称为散列值。简单来说就是一种将任意长度的输入消息压缩成某一固定长度的消息摘要的函数。
在加密中,哈希函数是一种不可逆的加密方法,它的一个特点就是是单向性。
代码签名证书
在开发人员签署软件程序之前,他们需要生成一个公钥/私钥对,这可以通过“OpenSSL”等软件工具在本地完成。然后,开发人员将公钥和企业的身份信息提供给可信赖的CA。
CA验证身份信息的真实性,然后向开发者颁发证书,该证书是由CA的私钥签名的代码签名证书,证书中包含了开发者的身份和开发者的公钥。
在准备好“签名”以证明开发者身份前,开发人员会将他们生成的所有代码计算哈希值。然后,使用上述私钥以及包含公钥和作者身份的代码签名证书进行数字签名,将签名打包到发布的软件中。
图片来源:百度
大多数浏览器和操作系统都预装了CA的公钥。当用户下载软件时,他们使用CA的公钥首先验证嵌入在签名软件中的代码签名证书的真实性,以确认它来自可信的CA。
然后从证书中提取开发人员的公钥并用于解密加密的哈希,再次对软件计算哈希值,并将新值与解密值进行比较。
如果用户的哈希值和开发者的哈希值匹配,则说明软件在传输过程中没有遭到损坏或篡改,然后系统会提醒用户该软件与开发人员发行时一样。
代码签名技术可以让用户验证其下载程序的可靠性和有效性。但恶意行为者也可能会通过生成代码签名证书和公私密钥对,给用户造成该软件获得合法CA授权的假象,假如任何人都可以随意创建签名证书,那用户就不好辨别所下载软件的真伪。这时候根证书就发挥了作用,如果把代码签名证书比作成是家谱,通过根证书,用户可以追溯证书来源,从而验证其真实性。