★什么是“数字签名”?
所谓的“数字签名”,通俗来说,就是采用某种技术手段来证明某个信息确实是由某个机构(或某个人)发布的。因为其用途有点类似于传统的手写签字,所以称之为“数字签名”。
★为何要用数字签名验证文件?
通常需要验证一个文件在传输或存储中,没有被不受信任的第三方修改(例如,加入病毒或后门等恶意代码)。
现在假设一种情况,有人潜入官网,并偷偷地把“官方的文件及其散列值”替换成“伪造的文件及其散列值”。这时,通过对比文件的散列值来验证文件完整性的方法就会失效。
为了保证防止篡改,我们可以使用“数字签名”来确认文件的来源是官方,而不是第三方。
★数字签名的原理
数字签名的技术实现需要依赖于“非对称加密技术”和“数字证书体系”。
◇数字签名的数学基础
数字签名依赖“非对称加密技术”,而“非对称加密技术”依赖于“单向函数”。
在《浅谈加密散列函数》中我已经说过,加密散列函数也依赖“单向函数”,而且单向函数是否存在仍然是计算机科学中的一个“开放性”问题。
因为没人知道单向函数存不存在,只是现在当它存在来用。
◇数字证书体系
数字签名还依赖“数字证书体系”,简单来说,就像日常生活中的公证处,大家找到一个可信任的第三方机构(类似中介),让他来认可我们的“签名”。
实际上,数字证书体系也使用“非对称加密技术”。
更多的详情就不在这里展开了,有兴趣的同学可以看一看《公开密钥加密》和《数字证书及CA的扫盲介绍》。
★数字签名的可靠性
如果你不能理解“非对称加密”和“数字证书体系”,这一节就不用看了。你只要记住结论:你不该完全信任数字签名正常的文件。
◇为文件制作数字签名的过程
为文件制作数字签名的过程
在我们探讨使用数字证书所带来的威胁之前,让我们先来看看当一个文件与数字证书签署时的过程:
1.软件开发者编译文件;
2.计算文件的散列值;
3.用开发者的私钥加密散列值;
4.将加密的散列值和数字证书添加到文件的末尾。
◇数字证书的攻击手法
现在让我们来看看在每个阶段都可以执行的攻击。这里不讨论针对加密算法的弱点的理论攻击,我们只关注最常被网络罪犯在实践中使用的攻击方法。
1.在文件编译阶段植入恶意代码。
在许多大型软件公司中,文件编译完成后,文件就会自动签名。文件编译集中在专用的服务器上完成。
如果网络犯罪分子可以进入软件公司的网络,他们可以使用公司的服务器来编译一个恶意的文件,这样它就会自动得到公司的数字签名。通过这次攻击,网络犯罪分子获得了一个带有有效数字证书的恶意文件。
2.偷取私钥
有时,网络犯罪分子能够成功地渗透到一个公司网络中,并偷取一个用于签署文件的私钥。使用该密钥,他们可以签署任何恶意文件,并将其作为一个合法软件制造商生产的文件散播出去。
3.利用签名算法的漏洞
利用签名算法的漏洞, 这样就可以在一个签名文件中获得额外的空间,在这个文件中可以添加数据,而不影响签名检查的结果。
4.合法取得证书的使用
几年前,大型软件公司积极地使用数字证书,这些公司都是合法注册的。今天,证书正在越来越频繁地被个人软件开发人员和小公司使用。购买证书以签署可执行代码的过程非常简单。
这使得网络犯罪分子可以合法地购买证书来签署他们的恶意软件。
◇不受信任的证书
上面描述的所有情况下,偷私钥、侵入一个公司的服务器并用该公司的数字证书签署文件或购买一个证书签名恶意软件,最终的结果都是一样的:一个受信任的证书是用来签署一个恶意文件。
因此,尽管这些证书的真实性已经被CA验证过,但这些证书不能被认为是可信的,我们把这些证书描述为“不可信的”。
如果私钥被软件开发人员窃取,或者公司的服务器遭到入侵,而一个受信任的证书被用来签署恶意文件,那么CAs就会停止验证他们之前发布的证书的可信度(这个过程也被称为“收回证书”)。CA的反应速度取决于人们何时知道证书已经被滥用。
然而,当购买了一个证书来签署潜在的不需要的软件时,CAs并不总是能够收回证书。因此,该证书可能仍然有效,并用于签署潜在危险的软件。
下图显示了用于签署恶意软件和潜在不需要的软件的不受信任证书的比例(卡巴斯基实验室数据)。
◇防止运行不受信任证书签署的软件程序的方法
既然知道了攻击方法,那么也有防御方法,具体的方法可以去看原文,这里不再展开了。
Why You Should not Completely Trust Files Signed with Digital Certificates - Securelist
★结尾
虽然数字签名不是完美的,但在大多数情况下,数字签名还是很安全的。
在实战中,请看《验证文件的数字签名》。
★参考文献
1.扫盲文件完整性校验——关于散列值和数字签名
2.公开密钥加密
3.数字证书及CA的扫盲介绍
4.Why You Shouldnot Completely Trust Files Signed with Digital Certificates - Securelist
|
|