一直对RSA等非对称性加密算法理解不够透彻,这几天看到一篇英文文档What is a Digital Signature?介绍较为通俗。本文主要对该文档进行理解翻译:
数字签名是什么
主人公Bob拥有两个钥匙,公钥(public key)+私钥(private key),我们可以通过算法随机生成一对密钥。
公钥和私钥
公钥是对外的,每个人都可以获取到Bob的公钥,但是私钥是自己的。之前项目中有配置过支付宝生活号的密钥,通过本地生成一对RSA密钥,私钥保存在本地,公钥配置到支付宝生活号,同时获取到支付宝生活号服务的公钥保存到本地。通过互换公钥达到双方通信都能保证发送方唯一并且报文不被篡改。
如何理解公私钥
Bob的公钥,所有需要的人都可以获取到,保证私钥是私有的情况下。密钥是用来加密的,加密的信息是不可逆的,所以只有当对方拥有配对的钥匙的时候才能解开加密后的信息,密钥中的私钥和公钥都可以用来加密,然后另个钥匙对应解密。(这里可能有些人会不理解这两种加密如何区分,我们通常将私钥加密称之为签名也就是Digital Signature,公钥加密称之为加密,因为它并不能代表某种唯一的身份,而私钥加密的报文可以)。
如何理解Hash算法
我们这里和之后讲的hash算法是区别于一般的hash算法,通常我们将其理解为散列算法,每个x的输入得到唯一对应y输出(不排除随机碰撞导致产生的y一致),hash算法是密码学的基础,我们通常用md5和sha,这里有最重要的两条性质:
1.不可逆。所谓的不可逆的意思就是当你知道x的hash值,无法求出x。
2.无冲突。所谓的无冲突的意思就是当你知道x,无法求出一个y,使得x和y的hash值是相同的。
王小云教授制造了md5的碰撞,这样的碰撞是随机的,那么我们假设x和y的hash值碰撞,那么x和y在篡改了之后接收方是无法感知到的。但实际情况我们的输入x都是随机变化的,如果建立x到相同碰撞y的映射,这样的概率事件目前暂时不可能打败无冲突理论。
数字签名是如何工作的
我们假设现在Bob需要传送一份文档给某个同事,在这个过程中同事接受到文档后认为安全需要保证两个前提:
1.文档是由Bob发出的。
2.文档的内容没有被篡改(保证数据完整性 CIA中C = Confidentiality (机密性), I = Integrity (完整性), A = Avalibility(可用性)。
我们通过数字签名保证:
1.私钥只有Bob存有,文档绝对是由Bob发出。
2.在发送文档的时候,对文档内容进行类似md5加密,获得hash结果作为消息概要message digest,绑定文档内容一并发送,同事接受到消息之后对文档完整性进行验证,比对文档内容hash的结果和公钥验签解密获得的hash结果是否一致。如果一致,代表消息由Bob发出,并且未被篡改;如果不一致代表消息由Bob发出,但是被篡改过。
数字证书是什么
中间人攻击
之前尝试去理解了数字证书存在的必要性,既然非对称加密保证了通讯的完整性和来源,那么为何需要数字证书。想象一个场景,你在浏览器输入百度的网址,那么这个域名有可能被中间人劫持,实际上跳转到了黑客的中间服务器,由中间服务器去转发你的请求报文,真实的服务器将响应报文转发给中间服务器。因为真实服务器的公钥是公开的,那么黑客可以将对应的报文解密,同时修改报文的内容和消息概要。然后用自己的私钥进行签名,同时将死钥对应的公钥配置在浏览器客户端。客户端无法确定自己当前解密的公钥是不是真实的服务器公钥。
所以实际上我们认为非对称加密保证的完整性和来源,实际上是不能抵御中间人攻击的。基于这种情况,我们需要有一个第三方也就是数字证书机构(Certification Authority,CA)来保证客户端使用到正确的公钥。
数字证书的内容
给予上面的假设,我们可以想象一下数字证书需要准备哪些内容。具体的内容可能包含很多。个人觉得从理解上来说,这个数字证书的目的是需要保证客户端获取到正确的公钥进行解密,那么我们需要绑定一开始请求的域名和公钥(注册到CA),客户端再接受到响应的时候便直接从本地去取这个证书中的公钥。
那么我们如何保证这个证书的正确性或者说合法性?理所当然这个证书中必须带有响应CA的数字签名。
主流操作系统和浏览器里面会提前预置一些 CA 的证书(承认这些是合法的证书),然后所有基于他们认证的签名都会自然被认为合法。
数字证书的简单过程
数字证书Signature Certificate,在之前Bob和A同事通信的模型下,我们想象如果A同事的公钥被篡改成了B同事的公钥,A同事根本不知道自己接收到的消息来源已经默默从Bob变成了B同事。现实开发过程中也是很有可能发生,如果自己生成一对密钥,只要替换了公钥,另一方是无法感知到消息源的。为了防止这种情况发生,我们需要为消息源建立一个身份认证,类似身份证,我们需要第三方来证明自己的来源,做一个唯一的标示,那么我们在发送消息的时候附送上这个三方的数字证书,接收方直接通过三方提供的公钥来验签解密获取到公钥来进行验签。
PKI 体系(Public Key Infrastructure)
PKI体系在现代密码学领域中处于较为基础的地位,帮助解决了核心的证书管理问题。
一般情况下,PKI 至少包括如下组件:
- CA(Certification Authority):负责证书的颁发和作废,接收来自 RA 的请求,是最核心的部分;
- bRA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给 CA;
- 证书数据库:存放证书,一般采用 LDAP 目录服务,标准格式采用 X.500 系列。CA 是最核心的组件,主要完成对证书的管理。
CA 是最核心的组件,主要完成对证书的管理。
常见的流程为,用户通过 RA 登记申请证书,CA 完成证书的制造,颁发给用户。用户需要撤销证书则向 CA 发出申请。
用户证书可以有两种方式。一般可以由 CA 来生成证书和私钥;也可以自己生成公钥和私钥,然后由 CA 来对公钥进行签发。后者情况下,当用户私钥丢失后,CA 无法完成恢复。