信息安全——数字签名

一、数字签名背景

        假定A发送一条包含认证码的消息给B,他们之间仍然可能存在争议,例如A可以否认发过该消息,B无法证明A确实发了该消息。另外B也可以伪造一个不同的消息,但声称是从A收到的。也就是说,虽然保证了信息的完整性,但无法保证信息的抗否认性。

        在现实生活中,这种情况同样存在,所以在人们的工作和生活中,许多事物的处理需要当事者签名。例如,商业合同、政府部门的文件、财务的凭证等都需要当事人的签名。签名起到确认、核准、生效和负责等多种作用。

        实际上,签名是证明当事者身份和数据真实性的一种信息,具有保证信息的真实性和完整性的功能。在传统的以书面文件为基础的事务处理中,采用书面签名的方式,如手印、签字、印章等。书面签名得到司法部门的支持和承认,具有一定的法律效力。

        在以计算机文件为基础的现代事务处理中,应采用电子形式的签名,即数字签名(digitalsignature),它是一种防止源点或终点抵赖的鉴别技术,用于防范通信双方的欺骗。

        数字签名利用公钥密码体制进行,其安全性取决于密码体制的安全程度。

        在中国,数字签名是具法律效力的,正在被普遍使用。2000 年,中华人民共和国的新《合同法》首次确认了电子合同、电子签名的法律效力。2005 年4月1日起,中国首部《电子签名法》正式实施。

二、数字签名原理

2.1、数字签名须满足的要求

        在传统文件中,手写签名长期以来被用做用户身份的证明,或表明签名者同意文件的内容。实际上,签名体现了以下几个方面的保证:

  • (1)签名是可信的。签名使文件的接收者相信签名者是慎重地在文件上签名的。
  • (2)签名是不可伪造的。签名证明是签字者而不是其他的人在文件上签字。
  • (3)签名不可重用。签名是文件的一部分,不可能将签名移动到不同的文件上。
  • (4)签名后的文件是不可变的。在文件签名以后,文件就不能改变。
  • (5)签名是不可抵赖的。签名和文件是不可分离的,签名者事后不能声称他没有签过这个文件。

        手印、签名、印章等传统的书面签名基本上满足以上条件,所以得到司法部门的支持。因为一个人不能彻底伪装自己的笔迹,同时也不能逼真地模仿其他人的笔迹,而且公安部门有专业的机构进行笔迹鉴别。公章的刻制和使用都受到法律的保护和限制,刻制完全相同的两枚印章是做不到的,因为雕刻属于金石艺术,每个雕刻师都有自己的艺术风格,和笔迹一样,要彻底伪装自己的风格和逼真模仿别人的风格是不可能的。人的指纹具有非常稳定的特性,终身不变,据专家计算,大约50亿人才会有一例相同的。

        而在计算机上进行数字签名并使这些保证能够继续有效则还存在一些问题。有人可能会考虑到将自己手写的签名扫描到计算机中,在需要签名的地方将其粘贴上去。这种方法实际是存在问题的。

        首先,计算机文件易于复制,即使某人的签名难以伪造,但是将有效的签名从一个文件剪辑和粘贴到另一个文件是很容易的。这就使这种签名失去了意义。

        其次,文件在签名后也易于修改,并且不会留下任何修改的痕迹。

        所以,简单扫描手写签名是不能满足要求的。目前,人们对数字签名的要求是:要保证能够验证作者及其签名的日期时间;必须能够认证签名时刻的内容;签名必须能够由第三方验证,以解决争议。

根据这些特征,为了方便使用,更进一步的要求如下:

  • (1)依赖性:签名的产生必须依赖于被签名的信息。
  • (2)唯一性:签名必须使用某些对发送者来说是唯一的信息,以防止双方的伪造与否认。
  • (3)可验性:必须相对容易识别和验证该数字签名。
  • (4)抗伪造:伪造该数字签名在计算上是不可行的,根据一个已有的数字签名构造消息是不可行的;对一个给定消息伪造数字签名是不可行的。
  • (5)可用性:在存储器中保存-一个数字签名副本是现实可行的。

        人们利用公钥密码体制产生数字签名。用户用自己的私钥对原始数据的散列值进行加密,所得的数据即为数字签名。信息接收者使用信息发送者的公钥对附在原始信息后的数字签名进行解密后获得散列值,并通过与自已收到的原始数据产生的散列值对照,便可确认原始信息是否被篡改。这样就保证了消息来源的真实性和数据传输的完整性。

        有几种公钥算法都能用做数字签名,这些公钥算法的特点是不仅用公钥加密的消息可以用私钥解密,而且反过来用私钥加密的消息也可以用公钥解密。

2.2、签名方法

        从协议上区分,数字签名可以分为直接数字签名方法和仲裁数字签名方法。

2.2.1、直接数字签名

        先来看直接数字签名方法,其基本协议非常简单:

  • (1) A用它的私钥对文件加密,从而对文件签名。
  • (2) A将签名后的文件传给B。
  • (3)B用A的公钥解密文件,如果能够顺利地解出明文,则表示签名验证成功。

        一方面,保证了文件在签名后不会被修改;另一方面,A不可否认自己对这份文件的义务和责任。

        在实际过程中,这种做法的效率太低了。假设A传送的文件非常庞大,那么对整份文

        件进行加密就太浪费时间和资源了。并且有时候文件内容并不需要保密,例如政府的公告等。所以,数字签名协议常常与散列函数一起使用。A并不对整个文件签名,而是只对文件的散列值签名。数字签名协议原理如图所示。

        在下面的协议中,散列函数和数字签名算法是事先协商好的:

  • (1)A产生文件的散列值。
  • (2)A用她的私钥对散列值加密,以此表示对文件的签名。
  • (3)A将文件和签名送给B。
  • (4)B用A发送的文件产生文件的散列值,同时用A的公钥对签名的散列值解密。如果签名的散列值与自己产生的散列值匹配,则签名是有效的。

        采用这种方式,既保证了信息的完整性,又保证了信息的抗否认性,如果还需要保证信息的保密性,则可以加入对称或者非对称的加密方式。

        由于两个不同的文件具有相同的160位散列值的概率为1/2^160 ,所以在这个协议中使用散列函数的签名与使用文件的签名是一样安全的。

        以上的协议属于直接数字签名,这种签名方法只牵涉通信方。它假定接收方知道发送方的公钥。签名通过使用发送方的私钥加密来产生。但这种体制有个共同的弱点:方案的有效性依赖于发送方私钥的安全性

        如果发送方随后想否认发送过某个签名消息,他可以声称用来签名的私钥丢失或被盗用,并有人伪造了他的签名。通常需要采用与私钥安全性相关的行政管理控制手段制止这种情况,但威胁依然存在。

        改进的方式:如可以要求被签名的信息包含一个时间戳(日期与时间)。但同样存在问题: A的私钥确实在时间T被窃取,敌手可以伪造A的签名及早于或等于时间T的时间戳

为了解决直接数字签名中存在的问题,引入了仲裁者。

2.2.2、仲裁数字签名(对称密钥签名)

        从发送方A到接收方B的签名消息首先送到仲裁者S,S对消息及其签名进行一系列测试,以检查其来源和内容,然后将消息加上日期并与已被仲裁者验证通过的指示一起发给B。

        仲裁者在这一类签名模式中扮演敏感和关键的角色。所有的参与者必须极大地相信这一仲裁机制工作正常。

        首先,在协议执行以前,各方都不必有共享的信息,从而可防止共谋;其次,只要仲裁者的私钥不被泄露,任何人包括发送方都不能发送重放的消息;最后,对任何第三方(包括A)来说,X发往Y的消息都是保密的。当然,功能越齐全,付出的通信成本也越高。

三、数字签名算法

        数字签名的算法很多,应用最为广泛的三种是RSA签名、DSS签名和基于ECC密码体制的ECDSA数字签名。

3.1、几种算法简介

  1. RSA(Rivest-Shamir-Adleman): RSA算法是一种非对称加密算法,既可以用于加密数据也可以用于生成数字签名。它基于大数分解的难题,具有较高的安全性,但计算量较大。
  2. DSA(Digital Signature Algorithm): DSA是一种基于离散对数问题的数字签名算法。它较RSA算法计算量更小,适用于资源受限的环境,但在密钥生成过程中需要更长的时间。
  3. ECDSA(Elliptic Curve Digital Signature Algorithm): ECDSA是一种基于椭圆曲线密码学的数字签名算法。与RSA和DSA相比,ECDSA在相同的安全性水平下使用更短的密钥长度,计算速度更快,适用于资源有限的环境。
  4. EdDSA(Edwards-curve Digital Signature Algorithm): EdDSA是一种基于扭曲爱德华曲线密码学的数字签名算法。它继承了ECDSA的优点,并在安全性、效率和实现简洁性上有所改进。

3.2、RSA数字签名

假定RSA的公钥密码系统已经建立,若用户A要对某报文(或其他文件或数据分组)实现数字签名,并发送给B(B可能是用户,也可能是仲裁中心),则数字签名算法如下:

3.2.1、签名的实现

用户A使用自己的私钥SK对报文进行解密运算形成了签名,然后将报文和签名一起发送出去。

不过一般使用的方式是对明文的散列值进行加密。

实际上是用私钥对明文或者散列值进行解密运算的过程。注意,这里说的“解密运算”,并不是指将密文转换为明文的过程,而应该理解为一种广义的转换运算。

3.2.2、签名的验证

接收方B将接收到的签名用发送方A的公钥进行加密运算得到。同样,这里的“加密运算”也应该理解为一种广义的转换运算。如果是对散列值进行加密,用相同的散列函数处理接收到的报文得到新的散列码,若这个散列码和解密的签名相匹配,则认为签名是有效的,否则认为报文被篡改或受到攻击者欺骗。这是因为只有发送方知道自己的私钥,因此只有发送方才能产生有效的签名。

3.3、其他数字签名

另外还有一些其他特殊的签名:

3.3.1、不可否认签名

        对于不可否认签名,在得不到签名者配合的情况下其他人不能正确地对签名进行验证,从而可以防止非法复制和扩散签名者所签署的文件。这对保护软件等电子出版物的知识产权有积极意义。只有授权用户才能验证签名并得到软件开发者的服务,而非法复制者不能验证签名,从而无法获取服务。

3.3.2、盲签名

        需某个人对某数据签名,而又不能让他知道数据的内容。在无记名投票选举和数字化货币系统中往往需要这种盲签名,因此盲签名在电子商务和电子政务系统中有着广泛的应用前景。它和普通签名相比有两个特点,一个是签名者不知道所签署的数据内容,另一个是在签名被接收者泄露后,签名者不能追踪签名。

猜你喜欢

转载自blog.csdn.net/java_faep/article/details/132577713