一、问题背景
假定A发送一条包含认证码的消息给B,他们之间仍然可能存在争议,例如A可以否认发过该消息,B无法证明A确实发了该消息。另外B也可以伪造一个不同的消息,但声称是从A收到的。也就是说,虽然保证了信息的完整性,但无法保证信息的抗否认性。由于网络环境复杂,网络信息主要出现以下三个问题:
1、因为信息在网络上特定的传递方式,导致他人很容易截获传递中的信息,极有可能出现信息被串改。
2、如果信息的发送发和接收方发生了分歧,发送方不承认曾经发送过的消息。
3、接收方无法确认消息是否由指定的发送方发送。
在现实生活中,这种情况同样存在,所以在人们的工作和生活中,许多事物的处理需要当事者签名。例如,商业合同、政府部门的文件、财务的凭证等都需要当事人的签名。签名起到确认、核准、生效和负责等多种作用。
实际上,签名是证明当事者身份和数据真实性的一种信息,具有保证信息的真实性和完整性的功能。在传统的以书面文件为基础的事务处理中,采用书面签名的方式,如手印、签字、印章等。书面签名得到司法部门的支持和承认,具有一定的法律效力。
在以计算机文件为基础的现代事务处理中,应采用电子形式的签名,即数字签名(digitalsignature),它是一种防止源点或终点抵赖的鉴别技术,用于防范通信双方的欺骗。
二、问题分析
2.1数字签名满足的要求
在传统文件中,手写签名长期以来被用做用户身份的证明,或表明签名者同意文件的内容。实际上,签名体现了以下几个方面的保证:
(1)签名是可信的。签名使文件的接收者相信签名者是慎重地在文件上签名的。
(2)签名是不可伪造的。签名证明是签字者而不是其他的人在文件上签字。
(3)签名不可重用。签名是文件的一部分,不可能将签名移动到不同的文件上。
(4)签名后的文件是不可变的。在文件签名以后,文件就不能改变。
(5)签名是不可抵赖的。签名和文件是不可分离的,签名者事后不能声称他没有签过这个文件。
手印、签名、印章等传统的书面签名基本上满足以上条件,所以得到司法部门的支持。因为一个人不能彻底伪装自己的笔迹,同时也不能逼真地模仿其他人的笔迹,而且公安部门有专业的机构进行笔迹鉴别。公章的刻制和使用都受到法律的保护和限制,刻制完全相同的两枚印章是做不到的,因为雕刻属于金石艺术,每个雕刻师都有自己的艺术风格,和笔迹一样,要彻底伪装自己的风格和逼真模仿别人的风格是不可能的。人的指纹具有非常稳定的特性,终身不变,据专家计算,大约50亿人才会有一例相同的。
而在计算机上进行数字签名并使这些保证能够继续有效则还存在一些问题。有人可能会考虑到将自己手写的签名扫描到计算机中,在需要签名的地方将其粘贴上去。这种方法实际是存在问题的。
首先,计算机文件易于复制,即使某人的签名难以伪造,但是将有效的签名从一个文件剪辑和粘贴到另一个文件是很容易的。这就使这种签名失去了意义。其次,文件在签名后也易于修改,并且不会留下任何修改的痕迹。
所以,简单扫描手写签名是不能满足要求的。目前,人们对数字签名的要求是:要保证能够验证作者及其签名的日期时间;必须能够认证签名时刻的内容;签名必须能够由第三方验证,以解决争议。
根据这些特征,为了方便使用,更进一步的要求如下:
(1)依赖性:签名的产生必须依赖于被签名的信息。
(2)唯一性:签名必须使用某些对发送者来说是唯一的信息,以防止双方的伪造与否认。
(3)可验性:必须相对容易识别和验证该数字签名。
(4)抗伪造:伪造该数字签名在计算上是不可行的,根据一个已有的数字签名构造消息是不可行的;对一个给定消息伪造数字签名是不可行的。
(5)可用性:在存储器中保存-一个数字签名副本是现实可行的。
人们利用公钥密码体制产生数字签名。用户用自己的私钥对原始数据的散列值进行加密,所得的数据即为数字签名。信息接收者使用信息发送者的公钥对附在原始信息后的数字签名进行解密后获得散列值,并通过与自已收到的原始数据产生的散列值对照,便可确认原始信息是否被篡改。这样就保证了消息来源的真实性和数据传输的完整性。
有几种公钥算法都能用做数字签名,这些公钥算法的特点是不仅用公钥加密的消息可以用私钥解密,而且反过来用私钥加密的消息也可以用公钥解密。
2.2数字签名方法
从协议上区分,数字签名可以分为直接数字签名方法和仲裁数字签名方法。
2.2.1直接数字签名
直接数字签名是只涉及到通信双方的数字签名。为了提供鉴别能力,直接数字签名,一般使用公钥密码体制。主要有以下几种方式:
- 发送者使用自己的私钥对消息直接进行签名,接受方用发送方的公钥对签名进行鉴别。
这种方法基于数字签名可提供认证功能,其特点是:只有A(发送方)知道A的私钥,能用其进行加密;传输中无法被篡改;任何第三方都可以用A的公钥验证签名。
但这种方法也存在一定的问题:被签名消息不具有保密性,因为任何人都可以从公开途径获得A的公钥对签名进行解密,从而获知消息的内容。
有一种改进方式:A—>B:Ek[EKRa[M]]
它基于对称密码体制提供了对签名的加密保护,解决了上述方式存在的问题,只有知道密钥K的人才能解密,验证签名并获知M(消息)的内容。
- 发送方先生成消息摘要,然后对消息摘要进行签名。A—>B:M||EKRa[H(M)]。
这种方法同样基于数字签名可提供认证功能。其好处是:H(M)具有压缩功能,这使得签名处理的内容减少,速度加快。其存在的问题:被签名的消息不具有保密性,因为消息以明文的形式传递。
改进方法:A—>B:Ek[M||EKRa[H(M)]]或A—>B:Ek[M]||EKRa[H(M)]
这种方法实现了对消息的保密,也提供基于数字签名的认证。
直接数字签名的缺点:
(1)验证依赖于发送方的私有密钥的唯一性和保密性。
发送方要抵赖发送某一消息时,可能会声称其私有密钥丢失或被窃,从而被他人伪造了签名。
通常需要采用与私有密钥安全性相关的行政管理控制手段来制止或至少是削弱这种情况,但威胁在某种程度上依然存在。
改进的方式:要求被签名的信息包含一个时间戳,该时间戳由公正的第三方生成,标明消息被签名的日期与时间。并要求密钥一旦泄露,就要立即将已暴露的密钥报告给一个授权中心, 以便在证书撤消列表CRL(Certificate Revocation List)上公布并宣布其失效。
- A的某些私有密钥可能在时间T被窃取,敌方可以伪造 A的签名及早于或等于时间T的时间戳。
2.2.2可仲裁数字签名
可仲裁数字签名在通信双方的基础上引入了仲裁者的参与。通常的做法是所有从发送方X到接收方 Y的签名消息首先发送给仲裁者A,A 将消息及其签名进行一系列测试,以检查其来源和内容,然后将消息加上日期(时间戳由仲裁者加上),并与已被仲裁者验证通过的签名一起发给Y。仲裁者在这一类签名模式中扮演裁判的角色。前提条件:所有的参与者必须绝对相信这一仲裁机制工作正常。
可仲裁数字签名主要有以下几种使用形式。
(1)单密钥加密方式,仲裁者 A 可以获知消息。
在这种方案中,X与A之间共享密钥KxA,Y与A 之间共享密钥KYA。
X准备消息M,计算其散列码H(M),用X的标识符IDX和散列值经KxA加密后构成签名E| H(M)],并将消息及签名发送给A:X—>A:M||EKXA[IDX|| H(M)]
A 解密签名, 用H(M)验证消息M, 然后将IDₓ、M、签名EKXA[IDX|| H(M)]
和时间戳T一起经KYA加密后发送给 Y:A—>Y:EKYA[IDX||M||EKXA[IDX|| H(M)]||T]
Y解密A发来的信息,并可将M和签名保存起来。
(2)单密钥加密方式,仲裁者不能获知消息。
在这种情况下,X与Y 之间共享密钥KXY。
X将标识符IDₓ,密文EKXY[M],以及对IDₓ和密文消息的散列码用KXA加密后形成签名发送给A:X—>A:IDₓ||EKXY[M]||EKXA[IDₓ||H(EKXY[M])]
A解密签名,用散列码验证消息,这是A只能验证消息的密文,而不能读取其内容,然后A将来自X的所有信息加上时间戳并用KAY加密后发送给Y:A—>Y:IDₓ||EKA[IDX||EKXY[IDX||H(EKXY[M])]||T]
- 双密钥加密方法,仲裁者不能获得消息。
X对消息M双重加密:首先使用X的私钥KRX,然后使用Y 的公钥KUY,形成一个签名的,保密的消息。然后将消息以及X的标识符一起用X的私钥签名后与IDX一起发送给A。X—>A:IDₓ||EKRA[IDX||EKUY(EKRX[M])]
这种双重加密的消息对除Y以外的其他人都是保密的。
A检查X的公开/私有密钥对是否仍然有效,如果有效,则认证消息,并将包含IDX双重加密消息和时间戳构成的消息用KRA签名后发送给Y:A—>Y:EKRA[IDX||EKUY(EKRX[M])||T]
三、数字签名算法
数字签名的算法很多,应用最为广泛的三种是RSA签名、DSS签名和基于ECC密码体制的ECDSA数字签名。
3.1 RSA数字签名算法
RSA是目前计算机密码学中最经典算法,也是目前为止使用最广泛的数字签名算法,RSA数字签名算法的密钥实现与RSA的加密算法是一样的,算法的名称都叫RSA。密钥的产生和转换都是一样的,包括在售的所有SSL数字证书、代码签名证书、文档签名以及邮件签名大多都采用RSA算法进行加密
3.1.1MD2、MD4、MD5算法
最常见的是我们熟知的MD5加密算法,MD5全称Message-Digest Algorithm 5(信息-摘要算法 5),目前比较普遍的Hash算法,是散列算法的基础原理,MD5的前身有MD2、MD3和MD4。MD5算法法是输入任意长度字符,输出固定长度128位的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128位Hash值,主要方式是通过求余、取余、调整长度、与链接变量进行循环运算进而得出结果.
3.1.2SHA-1算法
SHA-1是由NIST NSA设计为同DSA一起使用的,SHA-1设计时基于和MD4相同原理,并且模仿了该算法,SHA-1抗穷举(brute-force)性更好,它产出160位的Hash值,对于非线性运算、移位和加法运算也与MD5类似。SHA-1也应用于包括TLS和SSL、PGP、SSH、S/MIME和IPsec等多种协议中,曾被视为是MD5的后继者。SHA-1的如今已经明确不具备安全性可言了。
在2016年1月1日后基于SHA-1签发的SSL和代码签名的X.509证书已不具备安全性可言,多个操作系统、浏览器都建议将基于SHA-1而签发的证书、代码签名替换至SHA-2的产品,但目前在Windows XP(官方已停更)操作系统上仍然只兼容基于SHA-1算法的SSL和代码签名产品。
就在2017年2月23日Google宣布实现了对SHA-1算法的碰撞破解,所以SHA-1算法已经正式被宣布为不安全的算法,主流厂商对自身产品及安全要求都提升至了SHA-2算法。
3.1.3SHA-2算法
SHA-224、SHA-256、SHA-384和SHA-512并称为SHA-2,发布于2001年,目前比较广泛应用的SSL数字证书和代码签名证书签名算法均采用SHA-256算法,相较于SHA-1算法而言,至今SHA-2算法还未被破解,从某种意义上SHA-2延用了SHA-1算法,所以至少发文时间起是安全的。目前顶级CA和Google、苹果等公司都采用基于SHA-256算法作为SSL证书和代码签名证书的主流签名算法。
3.1.4SHA-2算法
SHA-3算法正式发布于2015年,SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。由于对MD5、SHA-0和SHA-1出现成功的破解,NIST感觉需要一个与之前算法不同的,可替换的加密Hash算法,也就是现在的 SHA-3。
3.2 DSA数字签名算法
DSA全称Digital Signature Algorithm,DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,所以它比RSA要快很多,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。
3.3 ECDSA椭圆曲线数字签名算法
ECDSA是用于数字签名,是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。而ECC(全称Elliptic Curves Cryptography)是一种椭圆曲线密码编码学。
ECC与RSA 相比,有以下的优点:
a. 相同密钥长度下,安全性能更高,如160位ECC已经与1024位RSA、DSA有相同的安全强度。
b. 计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。
c. 存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。
d. 带宽要求低使得ECC具有广泛得应用前景。
四、总结
数字签名的过程涉及公钥加密技术和哈希函数技术。公钥加密技术使用一对密钥:一个私钥和一个公钥。私钥由信息发送者保管,而公钥可以公开。发送者使用私钥对信息(或其哈希值)进行加密,生成数字签名。接收者则使用发送者的公钥对数字签名进行解密,以验证信息的来源和完整性。
哈希函数技术是数字签名的另一个关键组成部分。哈希函数将任意长度的输入数据映射为固定长度的输出(哈希值或消息摘要)。发送者先使用哈希函数对原始信息进行哈希处理,然后用私钥对这个哈希值进行加密,形成数字签名。接收者在收到信息后,会用相同的哈希函数对收到的信息进行处理,并用发送者的公钥解密数字签名,比较两个哈希值是否一致,从而验证信息是否被篡改。
数字签名是维护网络空间安全的重要工具,它通过提供数据完整性、来源验证和不可抵赖性,为个人和企业提供了一种可靠的电子认证手段。随着网络技术的不断发展,数字签名将继续在保障网络安全和促进电子商务发展中发挥关键作用。