随着现在网银、电子商务的普及,“数字签名”屡屡被提到,我也曾一度迷惑,直到看到Mozilla MDN上的一篇文章*Digital Signatures*,下面我将翻译一下这篇文章。

加密和解密解决了三大互联网安全隐患(窃听、篡改、伪装)之窃听的问题,但是却没法避免信息被篡改。

本篇文章将向你介绍公共秘钥加密如何解决这个问题。

信息篡改及相关的认证技术依赖于一个数学函数单向哈希函数one-way hash,也称作信息摘要)。单项散列函数可以根据原始数据生成一个定长的数据摘要,并且具有如下特性:

  • 原始数据不同,摘要不同(注:严格说来这句话不对,当数据大到一定程度,会发生碰撞的可能,但是概率实在太小了,可以忽略不计)。只要修改或者删除原始数据中哪怕一个字符,摘要都会发生显著的改变。
  • 原始数据不可能由摘要推出,这也是单向哈希的名字由来。

同样地,在公共密钥加密中为了进行数字签名,要产生一对秘钥(key),一个称为私有签名秘钥private signing key ),一个称为公开验证秘钥public verification key)。后者是公开的,前者是保密的,只有所有者知道。二者在数学上有一定的联系,想从公开验证秘钥推出私有签名秘钥几乎是不可能的或者要付出高昂的代价(注:比如时间、金钱)。摘要及其他相关信息,连同哈希算法,一并被称为数字签名。

下图简单展示了数字签名如何验证数据的合法性。

数字签名

上图显示发送者将两份数据发送给接受者:一份原始数据,一份加密过的摘要数据,即用私钥和相关的单向哈希算法加密过的数据摘要(注:这里有两个过程,第一步求数据摘要:原始数据->摘要,第二步加密:摘要->加密过的摘要)。为了验证数据的合法性,接受者首先使用签名者的公钥对加密摘要进行解密得到摘要,然后对原始数据应用同样的单向哈希算法得到一份新的摘要(单项哈希算法会和数据一并发送给接受者,图中未标出),最后,接受者对比这两份摘要。如果二者一致,那么说明数据没有篡改,否则数据可能被篡改或者发送过来的公钥和签名者的私钥不匹配。

如果两份摘要一致,接受者就能确定解密签名的公钥和生成签名的私钥是匹配的,然后进一步确认签名者的身份,尽管要确认签名者的身份还需要其他一些步骤来确定这个公钥确实属于某个人或实体,详见*Introduction to Public-Key Cryptography*.

数字签名的意义堪比手写签名。如果秘钥没有失去所有者的控制,一旦签名,过后很难进行否认。数字签名的这个特性提供了高度的不可否认性,签名者签名后就无法抵赖。以致在一些情形中,数字签名具有手写签名的同等法律效力。