公开密钥加密技术有两大应用,之前已经聊了一个,就是加密通信,本节来聊另外一个:数字签名。数字签名的基本作用跟现实世界的纸笔形式的签名有什么相同点和不同点,数字签名的基本原理和流程又是什么呢?
参考资料
基本原理
先说数字签名的基本原理。数字签名过程跟加密通信有着一定的对称性,这种对称有着一种逻辑上的美。
加密通信是用公钥进行加密,而用私钥进行解密。而数字签名刚好相反,是采用私钥加密,公钥解密。对于加密通信,公钥加密过程就是通过加密算法把信息加密成密文,私钥解密过程就是通过解密算法解密密文。而对于数字签名,私钥加密过程是通过签名算法来生成数字签名的过程,而公钥解密过程是通过验证算法来确定数字签名是不是有私钥持有者签署的。可以看到,加密算法,解密算法,签名算法,验证算法,对称性是很明显的。
数字签名的主要的作用是认证签署人身份,说得具体点,就是让所有人能够确认这个数字签名是不是由私钥的持有人创建的。数字签名是由签名算法去生成的,签名算法的输入有两个,一个是私钥,另一个是被签署的信息,输出的一个字符串就是数字签名了。签名到底是不是由私钥持有人签署的,要通过验证算法判断。验证算法有三个输入,一个是信息本身,另外一个是数字签名,第三个是公钥,输出的结果就是验证成功或者验证失败。数字签名过程中,私钥是“签名 key”,公钥是“验证 key”。
所以说数字签名的原理是非常清晰的,因为数字签名本身跟加密通信形成一个对称关系,而数字签名自己的签名过程跟验证过程,也是个对称关系。把握这种对称性,就比较容易记住基本原理了。
基本流程
静态的基本原理懂了,咱们再来从时间维度看看数字签名动态流程。
Alice 要签署一个文件,于是她就拿出自己的私钥,执行签名算法,得到数字签名。那么其他人如何去验证这个数字签名的确出自 Alice 呢?首先,Alice 要把自己的公钥放到一个大家都可以访问到的服务器上,这样其他人都可以获得 Alice 的公钥,大家把文件,数字签名以及公钥下载到自己的计算机上,调用验证算法,就可以判断这个文件是不是 Alice 签署的了。不管是签名算法还是验证算法都是全球公开的,每个人都可以在自己的计算机上安装软件来执行这两个算法。
这就是一个 Alice 签署文件,其他人验证签名的完整过程了。这个过程中有一点要注意,就是签名本身是不会加密文件本身的。在底层,签名过程其实是加密了文件的哈希值,总之签名的目的不在于加密文件信息,而在于生成数字签名。
实际作用
最后来聊聊数字签名的作用。数字签名有三大作用
- 认证
- 防止抵赖
- 保证文件完整性,也就是没有被篡改过
先看第一个认证,意思就是确认签署人身份,这个跟纸笔签名的作用是一致的。再看第二个防止抵赖,同样是纸笔签名也拥有的特性,一份合同签署了,就要承担责任,白纸黑字,不能耍赖。第三个作用是保证文件没有被篡改过,这个作用纸笔签名很难保证,比如签名只签署了最后一页,那么如果有人想悄悄换掉了前几页的内容,签名本身是阻止不了的。但是数字签名就可以,因为数字签名是由两个输入运算得出的,一个是私钥,另一个就是文件,所以如果在验证过程中,发现文件有改动,验证会失败。这个很类似于现实世界签合同的时候,有时候需要故意用签名或者图章覆盖有文字的区域,或者在写信的时候,给信封加上蜡封,这些措施也都是为了防篡改。
这就是数字签名的三大作用,主要用在各种防伪造场合,在世界上很多国家,数字签名都是有法律效力的。另外要注意,数字签名属于电子签名的一种,但并不是所有的电子签名都是数字签名,这两个概念要区分一下。
总结
关于数字签名,本节就聊这么多。数字签名是公钥加密技术的两大应用之一。主要采用了私钥加密,公钥解密的方式,文件签署者用私钥签署文件,就表示他认可了这个文件的内容。要验证数字签名,只需要签名人公布自己的公钥即可,其他人通过验证数字签名即可验证文件是私钥签署的。签署人不需要暴露自己的私钥,就可以间接证明自己拥有私钥。除了认证签署人身份,数字签名还有两个作用,分别是防止抵赖和保证文件完整性。