数码签名(英语:Digital Signature,又称公钥数码签名)是一种功能类似写在上的普通签名、但是使用了公钥加密领域的技术,以用于鉴别数码信息的方法。一套数码签名通常会定义两种互补的运算,一个用于签名,另一个用于验证。法律用语中的电子签名与数码签名代表之意义并不相同。电子签名指的是依附于电子文件并与其相关连,用以识别及确认电子文件签署人身份、资格及电子文件真伪者;数码签名则是以数学算法或其他方式运算对其加密而形成的电子签名。意即并非所有的电子签名都是数码签名。

数码签名不是指将签名扫描成数码图像,或者用触摸板获取的签名,更不是落款

数码签名了的文件的完整性是很容易验证的(不需要骑缝章骑缝签名,也不需要笔迹鉴定),而且数码签名具有不可抵赖性(即不可否认性),不需要笔迹专家来验证。

简单的数码签名原理

历史

1976年,Whitfield Diffie和Martin Hellman首次描述了数码签名体系,他们根据陷门单向排列的功能推测了这种体系的存在。[1][2]不久之后,Ronald Rivest, Adi Shamir和Len Adleman发明了RSA算法,该算法可以用来生成原始的数码签名(因“普通”的RSA签名并不安全[3],这仅仅为概念验证)。1989年,使用了RSA算法的Lotus Notes 1.0是第一个被广泛推广的提供数码签名的软件包。[4]

在RSA算法之后,其他数码签名方案被很快开发出来——最早的三个分别为Lamport签名[5]、Merkle签名(也被称为“Merkle trees”或“Hash trees”)[6]、和Rabin签名[7]

1988年,Shafi Goldwasser、Silvio Micali和Ronald Rivest成为第一个严格定义数码签名安全要求的人。[8]他们描述了签名的攻击模型的层次结构,还提出了GMR签名方案——第一种被证明可防止伪造选定信息的数码签名,与现今能被接受的数码签名安全定义一致。[8]

使用

用户可以对其发出的每一封电邮进行数码签名。这不是指落款或签名档英语Signature block(普遍把落款讹误成签名)。

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

在台湾,2001年公布实施《电子签名法》做为数码签名的法源依据及规范,并且制发中华民国自然人证书及工商证书。

每个人都有一对“钥匙”(数码身份),其中一个只有本人知道(私钥),另一个公开的(公钥)。签名的时候用私钥,验证签名的时候用公钥。又因为任何人都可以落款申称他就是用户本人,因此公钥必须向接受者信任的人(身份认证机构)来注册。注册后身份认证机构给用户发一数码证书。对文件签名后,用户把此数码证书连同文件及签名一起发给接受者,接受者向身份认证机构求证是否真地是用用户的密钥签发的文件。

信息发布者可以使用数码签名:信息发布的目的是让人们知道信息,虽然没必要对消息进行加密,但是必须排除有人伪装信息发布者发布假消息的风险,这时信息发布者就可以使用数码签名。而对明文消息施加的签名,称为明文签名(clearsign)。[9]

软件的作者可以加上数码签名,以便用户下载后对签名进行验证。[10]

认证机构(CA)也可以为用户的公钥加上数码签名生成证书,以便人们确认用户公钥的合法性。[11]

SSL/TLS使用伺服器证书(加上了数码签名的伺服器公钥)认证伺服器身份是否合法。[11]

原理

通常会使用公钥加密,用私钥解密。而在数码签名中,会使用私钥加密(相当于生成签名),公钥解密(相当于验证签名)。[12]

可以直接对消息进行签名(即使用私钥加密,此时加密的目的是为了签名,而不是保密),验证者用公钥正确解密消息,如果和原消息一致,则验证签名成功。但通常会对消息的散列值签名,因为通常散列值的长度远小于消息原文,使得签名(非对称加密)的效率大大提高。注意,计算消息的散列值不是数码签名的必要步骤。[13]

在实际使用中,我们既想加密消息,又想签名,所以要对加密和签名组合使用,比如TLS就组合了加密和签名。[14]

数码签名应用了公钥密码领域使用的单向函数原理。单向函数指的是正向操作非常简单,而逆向操作非常困难的函数,比如大整数乘法。这种函数往往提供一种难解或怀疑难解的数学问题。目前,公钥密码领域具备实用性的三个怀疑难解问题为:质数分解离散对数椭圆曲线问题。

操作

数码签名就是将公钥密码反过来使用。签名者将讯息用私钥加密(这是一种反用,因为通常公钥密码中私钥用于解密),然后公布公钥;验证者使用公钥将加密讯息解密并比对消息(一般签名对象为消息的散列值。本节为了讲解方便,假设数码签名直接将消息而非散列值签名)。

因此,可靠的公钥密码算法均能构建出可靠的数码签名。下面讲解为何反用公钥密码算法能够构建出安全的数码签名。

Alice是签名者,假设她要对消息A进行签名。现在, Alice生成了其公私钥密码对,公布该公钥,然后将消息用私钥加密后发布。

现在,希望Alice的签名算法具有如下特性:1,确认消息在传输过程中没有丢位,没被篡改(完整性). 2,确认消息的发送者是发布公钥的Alice(认证). 3,确认Alice的确发布过该消息(不可否认性)

实现

数码签名算法是依靠公钥加密技术来实现的。在公钥加密技术里,每一个用户有一对密钥:一把公钥和一把私钥。公钥可以自由发布,但私钥则秘密保存;还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。

普通的数码签名算法包括三种算法:

  • 一种密码生成算法
  • 标记算法
  • 验证算法

RSAECDSA等算法可以实现数码签名。[15]常用的密码散列函数SHA家族

参考文献

外部链接

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.