签名算法

签名算法(Signature)是基于非对称加密的一种消息验证机制。一个数字签名用于证明其消息的可靠性真实性。一个合法的数字签名,可以让接收者有理由相信,这条消息是由一个已知的发送者创建的,并且这个发送者不能否认曾经发送这个消息,并且这个消息在传输过程中没有被篡改过。

常见的应用场景如软件包的签名。软件发布者在发布软件的同时会签署一个数字签名,这样使用软件的人就可以确认这个软件的真实性、可靠性。

签名算法的工作方式十分简单,对于一段需要签名的消息,首先使用某种数字摘要算法,即哈希算法算出摘要,然后使用非对称加密算法的密钥对消息的摘要进行加密。这个加密后的数据就是这段消息的数字签名。当接收方接收到消息之后,首先同样经过哈希算出摘要,然后使用数字签名的非对称加密算法的公钥,解开签名,然后比对两个哈希,即可得知是否是合法的。

实践

常用的签名算法有基于 RSA 系列的 RSA-PCKS#1 v1.5 和 RSA-PSS,和美国联邦标准的 DSA 及其衍生算法 ECDSA。其中 RSA-PCKS#1 v1.5 和 DSA 都比较老旧,不推荐使用。最推荐使用椭圆曲线数学体系的 ECDSA,其次是 RSA-PSS。

数字证书

数字证书是签名算法和非对称加密的一种应用。

在一个通信过程中,为了证明自己的身份,最好的方式是提供自己的数字证书来证明。但是仅仅传输一个证书,还不足以证明,因为在传输过程中,这个证书也可能被中间人篡改、替换。所以需要引入一个第三方的权威机构 CA,来证明自己的身份,就如同现实中的公证处一般。

具体操作过程就是自己将一些证明信息和公钥发送给 CA,CA 经过一定的审核之后,计算出这段信息的数字签名。也就是通过特定的 Hash 算法算出摘要,然后用 CA 的私钥进行加密。这就是一个数字签名。服务端只需要把这个数字签名和自己的证书一起发给客户端。客户端接收到之后,拿到 CA 的公钥,解出信息的摘要,然后自己用相同的 Hash 算法计算摘要,比对两个摘要,如果相同,则说明验证通过。

更加详细的讲解可以参看这篇文章