假定A发送一条包含认证码的消息给B,他们之间仍然可能存在争议,例如A可以否认发过该消息,B无法证明A确实发了该消息。另外B也可以伪造一个不同的消息,但声称是从A收到的。也就是说,虽然保证了信息的完整性,但无法保证信息的抗否认性。
在现实生活中,这种情况同样存在,所以在人们的工作和生活中,许多事物的处理需要当事者签名。例如,商业合同、政府部门的文件、财务的凭证等都需要当事人的签名。签名起到确认、核准、生效和负责等多种作用。
实际上,签名是证明当事者身份和数据真实性的一种信息,具有保证信息的真实性和完整性的功能。在传统的以书面文件为基础的事务处理中,采用书面签名的方式,如手印、签字、印章等。书面签名得到司法部门的支持和承认,具有一定的法律效力。
在以计算机文件为基础的现代事务处理中,应采用电子形式的签名,即数字签名(digitalsignature),它是一种防止源点或终点抵赖的鉴别技术,用于防范通信双方的欺骗。
数字签名利用公钥密码体制进行,其安全性取决于密码体制的安全程度。
在中国,数字签名是具法律效力的,正在被普遍使用。2000 年,中华人民共和国的新《合同法》首次确认了电子合同、电子签名的法律效力。2005 年4月1日起,中国首部《电子签名法》正式实施。
在传统文件中,手写签名长期以来被用做用户身份的证明,或表明签名者同意文件的内容。实际上,签名体现了以下几个方面的保证:
手印、签名、印章等传统的书面签名基本上满足以上条件,所以得到司法部门的支持。因为一个人不能彻底伪装自己的笔迹,同时也不能逼真地模仿其他人的笔迹,而且公安部门有专业的机构进行笔迹鉴别。公章的刻制和使用都受到法律的保护和限制,刻制完全相同的两枚印章是做不到的,因为雕刻属于金石艺术,每个雕刻师都有自己的艺术风格,和笔迹一样,要彻底伪装自己的风格和逼真模仿别人的风格是不可能的。人的指纹具有非常稳定的特性,终身不变,据专家计算,大约50亿人才会有一例相同的。
而在计算机上进行数字签名并使这些保证能够继续有效则还存在一些问题。有人可能会考虑到将自己手写的签名扫描到计算机中,在需要签名的地方将其粘贴上去。这种方法实际是存在问题的。
首先,计算机文件易于复制,即使某人的签名难以伪造,但是将有效的签名从一个文件剪辑和粘贴到另一个文件是很容易的。这就使这种签名失去了意义。
其次,文件在签名后也易于修改,并且不会留下任何修改的痕迹。
所以,简单扫描手写签名是不能满足要求的。目前,人们对数字签名的要求是:要保证能够验证作者及其签名的日期时间;必须能够认证签名时刻的内容;签名必须能够由第三方验证,以解决争议。
根据这些特征,为了方便使用,更进一步的要求如下:
人们利用公钥密码体制产生数字签名。用户用自己的私钥对原始数据的散列值进行加密,所得的数据即为数字签名。信息接收者使用信息发送者的公钥对附在原始信息后的数字签名进行解密后获得散列值,并通过与自已收到的原始数据产生的散列值对照,便可确认原始信息是否被篡改。这样就保证了消息来源的真实性和数据传输的完整性。
有几种公钥算法都能用做数字签名,这些公钥算法的特点是不仅用公钥加密的消息可以用私钥解密,而且反过来用私钥加密的消息也可以用公钥解密。
从协议上区分,数字签名可以分为直接数字签名方法和仲裁数字签名方法。
先来看直接数字签名方法,其基本协议非常简单:
一方面,保证了文件在签名后不会被修改;另一方面,A不可否认自己对这份文件的义务和责任。
在实际过程中,这种做法的效率太低了。假设A传送的文件非常庞大,那么对整份文
件进行加密就太浪费时间和资源了。并且有时候文件内容并不需要保密,例如政府的公告等。所以,数字签名协议常常与散列函数一起使用。A并不对整个文件签名,而是只对文件的散列值签名。数字签名协议原理如图所示。
在下面的协议中,散列函数和数字签名算法是事先协商好的:
采用这种方式,既保证了信息的完整性,又保证了信息的抗否认性,如果还需要保证信息的保密性,则可以加入对称或者非对称的加密方式。
由于两个不同的文件具有相同的160位散列值的概率为1/2^160 ,所以在这个协议中使用散列函数的签名与使用文件的签名是一样安全的。
以上的协议属于直接数字签名,这种签名方法只牵涉通信方。它假定接收方知道发送方的公钥。签名通过使用发送方的私钥加密来产生。但这种体制有个共同的弱点:方案的有效性依赖于发送方私钥的安全性。
如果发送方随后想否认发送过某个签名消息,他可以声称用来签名的私钥丢失或被盗用,并有人伪造了他的签名。通常需要采用与私钥安全性相关的行政管理控制手段制止这种情况,但威胁依然存在。
改进的方式:如可以要求被签名的信息包含一个时间戳(日期与时间)。但同样存在问题: A的私钥确实在时间T被窃取,敌手可以伪造A的签名及早于或等于时间T的时间戳。
为了解决直接数字签名中存在的问题,引入了仲裁者。
从发送方A到接收方B的签名消息首先送到仲裁者S,S对消息及其签名进行一系列测试,以检查其来源和内容,然后将消息加上日期并与已被仲裁者验证通过的指示一起发给B。
仲裁者在这一类签名模式中扮演敏感和关键的角色。所有的参与者必须极大地相信这一仲裁机制工作正常。
首先,在协议执行以前,各方都不必有共享的信息,从而可防止共谋;其次,只要仲裁者的私钥不被泄露,任何人包括发送方都不能发送重放的消息;最后,对任何第三方(包括A)来说,X发往Y的消息都是保密的。当然,功能越齐全,付出的通信成本也越高。
数字签名的算法很多,应用最为广泛的三种是RSA签名、DSS签名和基于ECC密码体制的ECDSA数字签名。
假定RSA的公钥密码系统已经建立,若用户A要对某报文(或其他文件或数据分组)实现数字签名,并发送给B(B可能是用户,也可能是仲裁中心),则数字签名算法如下:
用户A使用自己的私钥SK对报文进行解密运算形成了签名,然后将报文和签名一起发送出去。
不过一般使用的方式是对明文的散列值进行加密。
实际上是用私钥对明文或者散列值进行解密运算的过程。注意,这里说的“解密运算”,并不是指将密文转换为明文的过程,而应该理解为一种广义的转换运算。
接收方B将接收到的签名用发送方A的公钥进行加密运算得到。同样,这里的“加密运算”也应该理解为一种广义的转换运算。如果是对散列值进行加密,用相同的散列函数处理接收到的报文得到新的散列码,若这个散列码和解密的签名相匹配,则认为签名是有效的,否则认为报文被篡改或受到攻击者欺骗。这是因为只有发送方知道自己的私钥,因此只有发送方才能产生有效的签名。
另外还有一些其他特殊的签名:
对于不可否认签名,在得不到签名者配合的情况下其他人不能正确地对签名进行验证,从而可以防止非法复制和扩散签名者所签署的文件。这对保护软件等电子出版物的知识产权有积极意义。只有授权用户才能验证签名并得到软件开发者的服务,而非法复制者不能验证签名,从而无法获取服务。
需某个人对某数据签名,而又不能让他知道数据的内容。在无记名投票选举和数字化货币系统中往往需要这种盲签名,因此盲签名在电子商务和电子政务系统中有着广泛的应用前景。它和普通签名相比有两个特点,一个是签名者不知道所签署的数据内容,另一个是在签名被接收者泄露后,签名者不能追踪签名。